2014-12-31 回答
#include #define n 8 int column[n+1]; //同栏是否有皇后,1表示有 int rup[2*n+1]; //右上至左下是否有皇后,1表示有 int lup[2*n+1]; //左上至右下是否有皇后,1表示有 int queen[n+1]={0}; //???? 用来记录第i行的皇后放在第几个位置 int num; //case编号 void backtrack(int i); //递回求解 void main() { int i; num=0; for(i=1;i<=n;i++) column[i]=1; //???? column rup lup都是标记竖列,斜排是否能放皇后的,初始化为1,表示开始的时候所有位置都可以放 for(i=1;i<=2*n;i++) rup[i]=lup[i]=1; //???? 同上 backtrack(1); //重新寻找符合要求的位置 } void showanswer() //输出结果 { int x,y; printf("\ncase %d\n",++num); for(y=1;y<=n;y++) { for(x=1;x<=n;x++) { if(queen[y]==x) //????????????? 按每行每个位置输出,如果该位置是皇后就输出黑框,否则就是白框 { printf("*");//■表示皇后,输出时为白色方框 } else { printf("."); } } printf("\n"); } } void backtrack(int i) //递回求解 { int j; if(i>n) //不再回溯 //??????? 递归结束条件,i如果能够走到8以上,说明前面8行都已经填上皇后,就是一个解,去输出 { showanswer(); } else { for(j=1;j<=n;j++) { if(column[j]==1 && rup[i+j]==1 && lup[i-j+n]==1) //????????? 表示第i行第j位置能够放皇后 { queen[i]=j; //设为占用 //??????????? 把第i行的皇后放在j位置 column[j]=rup[i+j]=lup[i-j+n]=0; //?????? 把i,j位置所在的竖列和斜排的标记设为不能放皇后了 backtrack(i+1); //???????? 递归寻找i+1行 能放皇后的位置 column[j]=rup[i+j]=lup[i-j+n]=1; //?????????? 递归结束回来之后要把标记重新设回可以放,进行下一次搜索 } } } }