回溯法解决八皇后问题

八皇后问题是以国际象棋为背景的问题:有八个皇后(可以当成八个棋子),如何在 88 的棋盘中放置八个皇后,使得任意两个皇后都不在同一条横线、纵线或者斜线上。
八皇后问题是使用回溯法解决的典型案例。算法的解决思路是:
从棋盘的第一行开始,从第一个位置开始,依次判断当前位置是否能够放置皇后,判断的依据为:同该行之前的所有行中皇后的所在位置进行比较,如果在同一列,或者在同一条斜线上(斜线有两条,为正方形的两个对角线),都不符合要求,继续检验后序的位置。
如果该行所有位置都不符合要求,则回溯到前一行,改变皇后的位置,继续试探。
如果试探到最后一行,所有皇后摆放完毕,则直接打印出 8
8 的棋盘。最后一定要记得将棋盘恢复原样,避免影响下一次摆放。
#include<stdio.h>
int queen[8];//用于存放每行皇后所在的位置
int count=0;//摆放的方法种类
void print()
{
for(int r=0;r<8;r++)
{

for(int i=0;i<queen[r];i++)
{
	printf("0");
}
printf("#");
for(int j=queen[r]+1;j<8;j++)
{
	printf("0");
}
printf("\n");
}
printf("==================================\n");

}
int check(int line,int list)
{
int data;
for(int raw=0;raw<line;raw++)
{
data=queen[raw];
if(datalist)
return 0;
if((line+list)
(raw+data))
return 0;
if((line-list)(raw-data))
return 0;
}
return 1;
}
void eightQueen(int line)
{
for(int i=0;i<8;i++)
{
if(check(line,i))//判断位置是否合适
{
queen[line]=i;
if(line
7)
{
print();
count++;
queen[line]=0;
return;
}
eightQueen(line+1);
queen[line]=0;//恢复棋盘原始状态
}
}//找到该行的合适位置

}
int main()
{
for(int i=0;i<8;i++)//初始化
{
queen[i]=0;
}
int line=0;
eightQueen(line);
printf("%d \n",count);
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值