- 八皇后问题,是非常著名的,至今这个问题已有万种解法。
- 不研究刁钻的,用最明了,学过数据结构的人就能看的懂得方式,解出来就很OK
- 下面使用递归来解:
- 1、生成棋盘
- 2、放置棋子(递归)
- 3、验证棋子位是否符合规则、不符合则重放
- 扩展至n皇后数
using System;
using System.Collections.Generic;
namespace _8Quee
{
class Program
{
/// <summary>
/// 解的个数
/// </summary>
static int count;
static void Main(string[] args)
{
int n = int.Parse(Console.ReadLine());
List<int> queen = new List<int>(n);
for (int i = 0; i < n; i++)
{
queen.Add(0);
}
PutQueen(queen, n, 0);
Console.WriteLine("\n解的个数:{0}", count);
Console.ReadKey();
}
/// <summary>
/// 递归法 放置棋子
/// </summary>
/// <param name="n">列</param>
/// <param name="queen">“皇后”</param>
/// <param name="row">行</param>
private static void PutQueen(List<int> queen, int n, int row)
{
for (queen[row] = 1; queen[row] <= n; queen[row]++)
{
if (CheckQueens(queen, row))
{
row++;
if (row < n)
{
PutQueen(n, queen, row);
}
else
{
count++;
for (int i = 0; i < n; i++)
{
Console.Write(queen[i].ToString() + " ");
}
Console.WriteLine();
}
row--;
}
}
}
/// <summary>
/// 检查棋子位置
/// </summary>
/// <param name="queen">“皇后”</param>
/// <param name="row">行</param>
/// <returns></returns>
private static bool CheckQueens(List<int> queen, int row)
{
for (int i = 0; i < row; i++)
{
if (Math.Abs(queen[i] - queen[row]) == Math.Abs(i - row) || queen[i] == queen[row])
{
return false;
}
}
return true;
}
}
}
代码并没有经过优化,解出来就好 😃😃😃