八皇后中的问题
发布网友
发布时间:2022-05-10 17:04
我来回答
共2个回答
热心网友
时间:2023-10-17 18:35
我写的代码,其中分为结果92种和本质不同的12种,你可以根据你的需要更改代码:
源代码请参考我的 空间:http://hi.baidu.com/luosiyong/blog/item/331aa8ee212be9282df534e1.html
#include<stdio.h>
int A[9],t=0,temp[9],z;
int a[92][9],s[92][9],tt[8][8];
bool check(int m);
void save(void);
int k=0;
void queen(int r){
int i;
for(i=1;i<=8;i++)
{
A[8-r+1]=i;
if(check(8-r+1))
{
if(r>1)
queen(r-1);
else
{
save();
t++;
}
}
}
}
bool check(int m)
{
int i;
for(i=1;i<m;i++)
{
if(A[m]==A[i])
return false;
if(A[m]-m==A[i]-i)
return false;
if(A[m]+m==A[i]+i)
return false;
}
return true;
}
void save(void){
for(int i=1;i<=8;i++)
a[t][i]=A[i];//符合条件的进行存储,待筛选
}
bool check2(int temp[],int z)
{//判断当前的是否与前面已有的类似
k=0;
bool f[92];
for(int i=0;i<=z;i++)
{
f[i]=false;
for(int m=0;m<8;m++)
{
if((s[i][m]!=9-temp[m])&&//上下出现不对称
(s[i][m]!=temp[9-m])&&//左右出现不对称
(m!=temp[s[i][m]])&&//主对角线出现不对称
((9-m)!=temp[9-s[i][m]])&&//副对角线出现不对称
(m!=temp[9-s[i][m]])&&//逆时针转90度含有不重合点
(s[i][m]!=9-temp[9-m])&&//转180度含有不重合点
((9-m)!=temp[s[i][m]]))//顺时针转90度含有不重合点
{
f[i]=true;//即不相等
break;
}
}
}
for(i=0;i<=z;i++)
if(f[i]==false)
return false;
return true;
}
void main()
{
queen(8);
printf("第一次筛选的有%d种\n",t);
int z=0,i,j;
for(i=0;i<92;i++){
if(check2(a[i],z))
{
for(j=1;j<=8;j++)
s[z][j]=a[i][j];
z++;
}
}
for(i=0;i<z;i++)
{
for(int m=0;m<8;m++){
for(int n=0;n<8;n++){
tt[m][n]=0;
}
}
for(j=1;j<=8;j++)
{
printf("%2d",s[i][j]);
tt[s[i][j]-1][j-1]=1;
}
printf("\n");
printf("----------------\n");
for(m=0;m<8;m++){
for(int n=0;n<8;n++){
if(tt[m][n]==1)
printf(" *");
else
printf(" ");
}
printf("\n");
}
}
printf("本质不同的有%d种\n",z);
}
参考资料:http://hi.baidu.com/luosiyong/blog/item/331aa8ee212be9282df534e1.html
热心网友
时间:2023-10-17 18:35
dfdfd