Posted on 2006-04-13 19:26
魔のkyo 阅读(475)
评论(0) 编辑 收藏 引用 所属分类:
Programming
1 #include <stdio.h>
2 #include <conio.h>
3 #define SIZE 8 /*设置皇后的个数*/
4 #define FILEPATH "c:\\temp.txt" /*设置输出文件的路径,注意使用转义字符*/
5
6 int location[SIZE],lieused[SIZE],zhudjx[2*SIZE-1],fudjx[2*SIZE-1],sum;
7 FILE * fout;
8
9 void queen(int d){
10 int i,j;
11 if(d==SIZE){ /*d==SIZE说明找到了一种可能的情况*/
12 sum++;
13 for(i=0;i<SIZE;i++){
14 for(j=0;j<SIZE;j++){
15 fprintf(fout,"%d%c",location[i]==j?1:0,j==SIZE-1?'\n':' ');
16 }
17 }
18 fputc('\n',fout);
19 }
20 else{
21 for(i=0;i<SIZE;i++){
22 if(!lieused[i] && !zhudjx[i-d+SIZE-1] && !fudjx[i+d]){
23 lieused[i]=1; /*占领所在列*/
24 zhudjx[i-d+SIZE-1]=1; /*占领所在主对角线*/
25 fudjx[i+d]=1; /*占领所在副对角线*/
26 location[d]=i; /*记录第d行皇后的位置(为方便起见行列数均从0起计数)*/
27 queen(d+1); /*递规确定第d+1行皇后的位置*/
28 lieused[i]=0; /*下面是回溯的过程,释放所占领的位置*/
29 zhudjx[i-d+SIZE-1]=0;
30 fudjx[i+d]=0;
31 }
32 }
33 }
34 }
35
36 int main(){
37 fout=fopen(FILEPATH,"w");
38 queen(0);
39 printf("结果输出到%s,一共%d组解\n",FILEPATH,sum);
40 fclose(fout);
41 printf("----按任意键结束----\n");
42 getch();
43 return 0;
44 }
45