八皇后问题(回溯算法实现)
代码:
#include <cstdio>
#define N 8
int tot=0;
int C[N+1];
int vis[3][2*N+1];//col:0 列,1 副对角线,2 主对角线
void search(int cur);
void showAnswer();
int main()
{
search(0);
printf("all:%d",tot);
return 0;
}
void search(int cur)
{
if(cur==N){
tot++;
showAnswer();
}else{
for(int i=0;i<N;++i){
if(vis[0][i]==0&&vis[1][cur+i]==0&&vis[2][cur-i+N]==0){
C[cur]=i;
vis[0][i]=vis[1][cur+i]=vis[2][cur-i+N]=1;//表示列,副对角线,主对角线被占
search(cur+1);//递归下一行
vis[0][i]=vis[1][cur+i]=vis[2][cur-i+N]=0;//恢复,留给下一次使用
}
}
}
}
void showAnswer()
{
int x, y;
printf("\nanswer %d\n",tot);
for(y = 0; y < N; y++) {
for(x = 0; x < N; x++) {
if(C[y] == x) {//y行,逐个找皇后(用x来遍历找),就在C[y]列
printf(" Q");
}else{
printf(" .");
}
}
printf("\n");
}
}