前言
八皇后问题再此就不解释了。
直接赋给你们百度百科了。
https://baike.baidu.com/item/八皇后问题/11053477?fromtitle=八皇后&fromid=10742426&fr=aladdin
思路
1.首先第一个皇后放在棋盘的第一行的第一个位置。
2.然后需要把第二个皇后放在匹配的第二个位置。这时候判断是否和第一个皇后是否冲突。所以我要写一个判断是否冲突的函数。
3.接着我需要把第三个皇后放在第三行的第一个位置。然后判断是否冲突。以此类推,但是呢,如果我把第八个皇后摆完后,我需要会到第7个皇后,判断第七个皇后的下一个位置是否和前7个冲突,如果不冲突,则判断第8个位置是否还有别的位置可放。
这时候就需要回溯了。
解答
static int answerCount = 0;
static void Main(string[] args)
{
//设置为8皇后
//定义数组array, 保存皇后放置位置的结果.
int[] array = new int[8];
check(0, array);
Console.WriteLine(answerCount+"种解法");
Console.ReadKey();
}
/// <summary>
/// 摆放皇后
/// </summary>
/// <param name="n">第几个皇后(n 为0 到 7)</param>
public static void check(int n,int[] arr)
{
if (n == 8)
{
//大于arr
foreach (var item in arr)
{
Console.Write(item+" ");
}
Console.WriteLine("皇后分割线");
answerCount++;
return;
}
for (int i=0;i<8;i++)
{
arr[n] = i;
if (judge(n,arr))
{
check(n + 1,arr);
}
}
}
/// <summary>
/// 判断是否和其他皇后冲突
/// </summary>
/// <param name="n">第几个皇后(n 为0 到 7)</param>
/// <returns></returns>
public static Boolean judge(int n, int[] arr)
{
for (int i = 0; i < n; i++) {
if (arr[i]==arr[n]||n-i== Math.Abs(arr[n]-arr[i]))
{
return false;
}
}
return true;
}
结果
一共92种。