/*
* 使用回溯法解决n皇后问题
*/
#include <stdio.h>
#include <math.h>
#define NUM 8 //皇后的数目
int chess[NUM]; //依次表示每个皇后所在的列数
int count = 0;//总的解数
//表示能否在第i行value列放置皇后,行数是从0开始
bool canPlaced(int i,int value)
{
//第0行的皇后可以任意摆放
if (i==0)
{
return 1;
}
//依次检测之前的皇后,是否冲突
for (int j=0;j<i;j++)
{
//列冲突
if (chess[j]==value)
{
return false;
}
//对角线冲突
if (abs(i-j)==abs(chess[j]-value))
{
return false;
}
}
return true;
}
//打印出结果
void showResult()
{
int k;
for (int j=0;j<NUM;j++)
{
for (k=0;k<chess[j];k++)
{
printf("*");
}
printf("Q");
for (k=k+1;k<NUM;k++)
{
printf("*");
}
printf("\n");
}
printf("\n");
}
//采用递归回溯法
void backTrack(int t)
{
int i;
//皇后数目超出棋盘,摆放完毕
if (t>=NUM)
{
printf("\n");
showResult();
count++;
return;
}
else
{
//依次检测能否摆放
for (i=0;i<NUM;i++)
{
if (canPlaced(t,i))
{
chess[t] = i;
//若能够摆放,则摆放下一个
backTrack(t+1);
}
}
}
}
int main()
{
backTrack(0);
showResult();
printf("%d皇后问题共有%d个解\n",NUM,count);
return 0;
}
回溯法解决N皇后问题
最新推荐文章于 2021-11-28 16:00:16 发布