a[1..8]:代表皇后放置的位置。 例:a[3]=5;表示第3个皇后放置在第3行第5列。 既下标是行数,内容是列数
p[1..8];标志数组,宣布对应列已占领
m[1..20]:宣布对///斜线///已占领
w[1..20]:宣布对\\\斜线\\\已占领
小技巧:
在矩阵中,两个数同在///斜线///上,对应行列和相同;
在矩阵中,两个数同在\\\斜线\\\上,对应行列差相同;
#include <stdio.h>
int a[1010],p[1010],w[20],m[20];
int ans=0;
int f(int i){
int j;
for(j=1;j<=8;j++){ //每个皇后都有8个位置【列】可以试放
if(!p[j]&&!w[j-i+7]&&!m[j+i]){ //寻找放置皇后的位置 /\斜线 对应列未占领,\\\斜线\\\未占领,///斜线///未占领
a[i]=j; //摆放皇后
p[j]=1; //宣布占领第J列
w[j-i+7]=1; //占领对角线\\\\\\ 斜线
m[j+i]=1; //占领对角线// 斜线
if(i==8){ //8个皇后都放置好,则输出
int x,y;
printf("No. %d\n",++ans);
for(y=1;y<=8;y++){
for(x=1;x<=8;x++){
if(y==a[x])
printf("█"); //美化输出
// printf("1 ");
else
printf("◇"); //美化输出
// printf("0 ");
}
printf("\n");
}
}
else f(i+1); //继续递归放置下一个皇后
p[j]=0; //回溯:递归返回,当前皇后退出
w[j-i+7]=0;
m[j+i]=0;
}
}
}
int main(){
f(1);
return 0;
}