【 tulaoshi.com - 编程语言 】
/*八皇后问题可以有多种解法,我通过找寻棋盘上各个棋子之间的斜率来解决,想与大家共同探讨 -----SET*//*在TC上,调试通过*/#includemath.h
int check(int c[]) /*判定棋盘上八位数列是否符合斜率不为+1、-1、或0,且每位数字从1到8各出现一次,若符合返回1,否则为0*/
{int n,m;
for (n=0;n7;n++)
for (m=n+1;m8;m++)
if (c[m]1c[m]8c[n]==c[m]abs(c[n]-c[m])==abs(n-m))
return(0);
return(1);
}
main()
{int qp[8]={8,7,6,5,4,3,2,1},*p; /*qp[8]代表棋盘上八行,八个皇后在棋盘上一定是每行一个*/
/*八个皇后在棋盘上的横坐标一定各不相同,即1---8各出现一次*/ /*由于数12345678可被九整除,于是用穷举法找出所有能被九整除的八位数,*/ /*其中必包含1---8在八位中所有的排列组合*/ /*检测这些数列就能找出八皇后的所有可能*/ for (p=qp;qp[7]9;qp[0]+=9)
{for (p=qp;p&qp[7];) /*对12345678每次加9,直加到87654321*/
{if (*p9)
{*(p+1)+=1;
*p-=10;
p++;
}
else
p+=8;
}
if (check(qp)) /*检测八位数列,返回值为真则在屏幕上输出*/
{for (p=qp;p=&qp[7];p++) printf ("%d",*p);
printf (" ");
} } }