#include <iostream>
using namespace std;
#define MAX_LENGTH 50
int is_conflict(int *a, int n)
{
int flag= 0;
int i;
for(i= 0; i< n; i++)
{
if(a[i]== a[n]|| a[i]- a[n]== i- n|| a[i]- a[n]== n- i)
{
flag= 1;
break;
}
}
return flag;
}
void print_board(int *a, int n)
{
int i,j;
for(i= 0; i< n; i++)
{
for(j= 0; j< a[i]; j++)
{
cout<< " ";
}
cout<< "q";
for(j= a[i]+1; j< n; j++ )
{
cout<< " ";
}
cout<< "/n";
}
cout<< "--------/n";
}
void init_board(int *a, int n)
{
int i;
for(i= 0; i< n; i++)
a[i]= 0;
}
int queen(int n)
{
int count= 0;
int a[MAX_LENGTH];
init_board(a, n);
int i= 0;
while(1)
{
if(a[i]< n) // 如果没有超过棋盘范围,需要检查第n行与前n-1行是否冲突
{
if(is_conflict(a, i)) //如果有冲突,尝试下一个位置
{
a[i]++ ;
continue;
}
if(i>= n-1) // 如果是最后一行,也即找到一个解,首先输出它
{
count++;
print_board(a, n);
a[n-1]++;
continue; //然后尝试当前的皇后的下一个位置,看有没有解
}
i++; //如果没有冲突,进入下一行
continue;
}
else //超过棋盘的范围,改行的皇后复位
{
a[i]= 0;
i--;
if(i< 0)
{
return count;
}
a[i]++;
continue;
}
}
}
int main(void)
{
int n= 8;
int count= queen(n);
cout<< count<< " solutions in "<< n<< "queens problem "<< endl;
return 0;
}
八皇后问题 回溯法
最新推荐文章于 2022-04-17 15:30:45 发布