重新整理数据结构与算法——八皇后问题解决[十]

前言

八皇后问题再此就不解释了。

直接赋给你们百度百科了。

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种。

posted @ 2020-06-18 14:49  敖毛毛  阅读(218)  评论(0编辑  收藏  举报