回溯实现八皇后问题(C#)

本文通过回溯算法解决了经典的八皇后问题,详细介绍了算法思路,并提供了代码实现,最终输出了所有92种可能的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下利用回溯解决八皇后问题。总共有92种结果。 PrintQueen 是打印函数,isConfict 是用来判断是否冲突(在同一直线和斜线则有冲突)

EightQueen 为主函数,

算法思路: 先把第一个皇后放在(0,0)的位置。然后从第一行往下找,如果成功,则继续往下探索。一直到第八行,然后回溯。

如果回溯到第一行,说明第一个皇后在(0,0)的所有情况全部已经列出。接着遍历(0,1)一直到(0,7)

public class Program

{

static int count = 0;

static int[] chess = new int[8]{-1,-1,-1,-1,-1,-1,-1,-1};

static void PrintQueen()

{

Console.WriteLine(string.Format("========{0}==============", count));

for (int i = 0; i < 8; i++)

{



int m = 0;

int n = chess[i] + 1;

while (m < chess[i])

{

Console.Write("* ");

m++;

}

Console.Write("@ ");

while (n < 8)

{

Console.Write("* ");

n++;

}

Console.WriteLine("");



}

Console.WriteLine("=======================");

}



static bool isConfict(int x2, int y2)

{

int x1, y1;

for (int i = 0; i < x2; i++)

{

x1 = i;

y1 = chess[i];

if (y1 == y2 || (x1 - y1 == x2 - y2) || (x1 + y1 == x2 + y2))

return true;

}

return false;

}



static void EightQueen()

{

int column = 0;

int i = 0;

int t = 0;

int k = 0;

int z = 0;

while (column < 8)

{

chess[0] = column;

int m;

for (m = t; m < 8; m++)

{

k = i + 1;

chess[k] = m;

if (isConfict(k, m))//冲突就停止

{

continue;

}

else

{

z = m + 1; //保存上次找到的合法位置,以备回溯的时候当做起点。

i++;

m = -1;

}

if (i >= 7) // 成功也要回溯

{

count++;

PrintQueen();

i--;// 回溯

m = z;

continue;

}

if (i <= 0) // 如果回溯到了第一行,column++

{

column++;

i = 0; t = 0; k = 0;

break;

}

}

if (m >= 8 ) //失败

{

t = chess[i + 1] + 1;

if (t == 8)

{

i--; // 回溯到上一层

}

}

if (i < -1)

break;



}

Console.WriteLine("Done");

}

static void Main()

{

EightQueen();

}

}

转载于:https://www.cnblogs.com/zhangjiang/archive/2012/03/14/2396119.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值