11、数据结构与算法C:八皇后问题解决

前言

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

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

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

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: