求解皇后问题,有人给了下列程序,可惜我刚学还看不懂~
望高手帮我注释一下,不胜感激~!!!
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int Judge(int *p, int j)
//判断当前棋子位置是否符合规则,是则返回1,否则返回0;
{
int i;
for(i=0;i<j;i++)
{
if(p[j]==p[i]) return 0;
if(abs(p[j]-p[i])==j-i) return 0;
}
return 1;
}
int main()
{
int a[8]; //a[i]表示第i行的后所在位置(a[3]=0表示第3行的后在第0列)
int i=0,j=0,k=0;
for(a[0]=0;a[0]<8;j=0,a[j]++)
for(a[++j]=0;a[j]<8;j=1,a[j]++)
if(Judge(a,j))
for(a[++j]=0;a[j]<8;j=2,a[j]++)
if(Judge(a,j))
for(a[++j]=0;a[j]<8;j=3,a[j]++)
if(Judge(a,j))
for(a[++j]=0;a[j]<8;j=4,a[j]++)
if(Judge(a,j))
for(a[++j]=0;a[j]<8;j=5,a[j]++)
if(Judge(a,j))
for(a[++j]=0;a[j]<8;j=6,a[j]++)
if(Judge(a,j))
for(a[++j]=0;a[j]<8;a[j]++)
if(Judge(a,j))
{ for(i=0;i<8;i++) printf("%d",a[i]);
printf("%3s"," ");
if(!(++k%7)) printf("\n");
}
printf("\n\n%d\n\n",k);
printf("\n请按任意键结束...");
getch();
return 0;
}
----------------解决方案--------------------------------------------------------
在线等~~急~~!
----------------解决方案--------------------------------------------------------
高手来帮忙啊~!!!!!!!!!
----------------解决方案--------------------------------------------------------
这是经典题目啊,许多书上都有(不仅仅是C语言)。
算法:穷举法
具体实现――回朔法,即是用数组的代替多重循环。
即是
a[0]――第一重
a[1]――第二重
..........
..........
..........
a[n]――第n重
总的来说,是用数组a产生一个排列,然后再判断。
(算法出来了,编程应该是不成问题的)
----------------解决方案--------------------------------------------------------
哈哈~谢~!
----------------解决方案--------------------------------------------------------