posts - 225, comments - 62, trackbacks - 0, articles - 0
   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

解决N皇后问题的通用算法

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 
只有注册用户登录后才能发表评论。