本文主要是介绍C#八皇后算法:回溯法 vs 列优先法 vs 行优先法 vs 对角线优先法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
1.八皇后算法(Eight Queens Puzzle)
2.常见的八皇后算法解决方案
(1)列优先法(Column-First Method):
(2)行优先法(Row-First Method):
(3)对角线优先法(Diagonal-First Method):
(4)回溯法(Backtracking):
1.八皇后算法(Eight Queens Puzzle)
皇后问题是一个古老而著名的问题,它实质上就是使棋盘上的8个皇后不能在同一行、同一列或同一条斜线上,共有92种方法。
2.常见的八皇后算法解决方案
八皇后算法的解决方案有多种,以下是一些常见的解决方案:
(1)列优先法(Column-First Method):
首先选择一个空的棋盘,然后从第一行开始,尝试将皇后放置在每一列。如果当前列没有被攻击,那么就将皇后放置在该列。否则,尝试下一列。当找到一个有效的列时,将皇后放置在该列的最下方。重复这个过程,直到所有的皇后都被放置在棋盘上。
(2)行优先法(Row-First Method):
与列优先法类似,但不同之处在于,该方法从第一列开始,尝试将皇后放置在每一行。如果当前行没有被攻击,那么就将皇后放置在该行的最右侧。否则,尝试下一行。当找到一个有效的行时,将皇后放置在该行的当前列。重复这个过程,直到所有的皇后都被放置在棋盘上。
(3)对角线优先法(Diagonal-First Method):
该方法首先选择一个空的棋盘,然后从左上角开始,尝试将皇后放置在对角线上。如果当前对角线没有被攻击,那么就将皇后放置在该对角线的最下方。否则,尝试下一个对角线。当找到一个有效的对角线时,将皇后放置在该对角线的当前列。重复这个过程,直到所有的皇后都被放置在棋盘上。
(4)回溯法(Backtracking):
该方法通过递归的方式尝试所有可能的皇后位置。算法步骤如下:
- 选择一个空的棋盘。
- 选择一个皇后,将其放置在棋盘的第一行的任意一列。
- 选择下一个皇后,将其放置在下一行的任意一列,但不能与第一个皇后位于同一列或同一对角线上。
- 重复步骤3,直到所有的皇后都被放置在棋盘上。
// 八皇后算法_回溯法
namespace _144
{class Program{#region 八皇后算法/// <summary>/// 解决八皇后问题/// </summary>/// <param name="size">皇后数量</param>static void QueenArithmetic(int size){int[] Queen = new int[size];//每行皇后的位置int y, x, i, j, d, t = 0;y = 0;Queen[0] = -1;while (true){for (x = Queen[y] + 1; x < size; x++){for (i = 0; i < y; i++){j = Queen[i];d = y - i;//检查新皇后是否能与以前的皇后相互攻击if ((j == x) || (j == x - d) || (j == x + d))break;}if (i >= y)break; //不攻击}if (x == size) //没有合适的位置{if (0 == y){Console.WriteLine("Over"); //回溯到了第一行break; //结束}Queen[y] = -1; //回溯y--;}else{Queen[y] = x; //确定皇后的位置y++; //下一个皇后if (y < size)Queen[y] = -1;else{Console.WriteLine("\n" + ++t + ':');//所有的皇后都排完了,输出for (i = 0; i < size; i++){for (j = 0; j < size; j++)Console.Write(Queen[i] == j ? 'Q' : '*');Console.WriteLine();}y = size - 1;//回溯}}}Console.ReadLine();}#endregionstatic void Main(string[] args){ArgumentNullException.ThrowIfNull(args);int size = 8; //皇后数QueenArithmetic(size);}}
}
这篇关于C#八皇后算法:回溯法 vs 列优先法 vs 行优先法 vs 对角线优先法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!