0
点赞
收藏
分享

微信扫一扫

8皇后问题__扩展至n皇后问题__解题


8皇后问题__扩展至n皇后问题__解题_List

  • 八皇后问题,是非常著名的,至今这个问题已有万种解法。
  • 不研究刁钻的,用最明了,学过数据结构的人就能看的懂得方式,解出来就很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;
}
}
}

代码并没有经过优化,解出来就好 😃😃😃


举报

相关推荐

0 条评论