「8 皇后棋盤」程式實作
一、前言
因緣際會之下被要求撰寫取得 8 皇后棋盤的全部解答,因此特別寫撰寫文件,供日後參考。
二、規則
- 每個皇后不能再同列。
- 每個皇后不能再同行。
- 每個皇后不能同斜角線上。
三、操作
圖、開啟 VS2019 > 開啟新的 主控台應用程式 專案 > 輸入底下程式碼
class Program
{
/// <summary>
/// 主程式
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
var arr = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7 };
var arrs = GetArrs(arr);
arrs = RemoveObliqueLine(arrs);
foreach (var ans in arrs) {
Console.WriteLine($"第{arrs.IndexOf(ans) + 1}個棋盤");
foreach (var item in ans) {
var str = "........".Remove(item, 1).Insert(item, "Q");
Console.WriteLine(str);
}
Console.WriteLine($"");
}
Console.ReadKey();
}
/// <summary>
/// 移除 斜角線的棋盤
/// </summary>
/// <param name="arrs"></param>
/// <returns></returns>
private static List<List<int>> RemoveObliqueLine(List<List<int>> arrs)
{
var newArr = new List<List<int>>();
foreach (var arr in arrs)
{
if (!IsObliqueLine(0, arr))
{
newArr.Add(arr);
}
}
return newArr;
}
/// <summary>
/// 判斷任兩個皇后 是否 在斜角線
/// </summary>
/// <param name="ind"></param>
/// <param name="arr"></param>
/// <returns></returns>
private static bool IsObliqueLine(int ind, List<int> arr)
{
var res = false;
for (var i = ind+1; i < arr.Count(); i++)
{
res = Math.Abs(arr[i] - arr[ind]) == Math.Abs(i - ind);
if (res)
{
return res;
}
}
if (arr.Count() - (ind + 1) > 1)
{
return IsObliqueLine(ind + 1, arr);
}
return res;
}
/// <summary>
/// 取得 八皇后 不同列不同行的解
/// </summary>
/// <param name="arr"></param>
/// <returns></returns>
private static List<List<int>> GetArrs(List<int> arr)
{
var rets = new List<List<int>>();
for (var i = 0; i < arr.Count(); i++)
{
var a2 = arr.ToList();
a2.RemoveAt(i);
if (a2.Count() < 1)
{
rets.Add(arr);
break;
}
var arrs = GetArrs(a2);
foreach (var item in arrs)
{
item.Insert(0, arr[i]);
rets.Add(item);
}
}
return rets;
}
}
圖、執行結果
留言
張貼留言