自己用C语言写的解决8皇后问题的程序,帮忙看看有什么需要改善
8皇后问题,在8*8的国际象棋盘上,排列8个皇后,使其各自不能相互攻击。即横向,纵向,斜向不能存在皇后。问共有多少种排列?#include<stdio.h>
int test(int y0,int y1,int y2,int y3,int y4,int y5,int y6,int y7);
void printx(int y);
void main()
{
int i,y[8],ctr[8],num=0;
//因横向各不同,所以x轴定为1,2,3...,8,下面计算y的排列方法,也要各个不同
for(ctr[0]=1;ctr[0]<9;ctr[0]++)
{y[0]=ctr[0];
for(ctr[1]=1;ctr[1]<9;ctr[1]++)
{if(ctr[1]==ctr[0]){continue;}
y[1]=ctr[1];
for(ctr[2]=1;ctr[2]<9;ctr[2]++)
{if((ctr[2]==ctr[0])||(ctr[2]==ctr[1])){continue;}
y[2]=ctr[2];
for(ctr[3]=1;ctr[3]<9;ctr[3]++)
{if((ctr[3]==ctr[0])||(ctr[3]==ctr[1])||(ctr[3]==ctr[2])){continue;}
y[3]=ctr[3];
for(ctr[4]=1;ctr[4]<9;ctr[4]++)
{if((ctr[4]==ctr[0])||(ctr[4]==ctr[1])||(ctr[4]==ctr[2])||(ctr[4]==ctr[3])){continue;}
y[4]=ctr[4];
for(ctr[5]=1;ctr[5]<9;ctr[5]++)
{if((ctr[5]==ctr[0])||(ctr[5]==ctr[1])||(ctr[5]==ctr[2])||(ctr[5]==ctr[3])||(ctr[5]==ctr[4])){continue;}
y[5]=ctr[5];
for(ctr[6]=1;ctr[6]<9;ctr[6]++)
{if((ctr[6]==ctr[0])||(ctr[6]==ctr[1])||(ctr[6]==ctr[2])||(ctr[6]==ctr[3])||(ctr[6]==ctr[4])||(ctr[6]==ctr[5])){continue;}
y[6]=ctr[6];
for(ctr[7]=1;ctr[7]<9;ctr[7]++)
{if((ctr[7]==ctr[0])||(ctr[7]==ctr[1])||(ctr[7]==ctr[2])||(ctr[7]==ctr[3])||(ctr[7]==ctr[4])||(ctr[7]==ctr[5])||(ctr[7]==ctr[6])){continue;}
y[7]=ctr[7];
if (test(y[0],y[1],y[2],y[3],y[4],y[5],y[6],y[7])==1)
{num+=1;
printf("[%3d]:\n",num);
for(i=0;i<8;i++)
{printx(y[i]);}
getchar(); //敲击enter键输出
}
}}}}}}}}
printf("ALL:%d\n",num);
}
//test函数测试斜向是否有皇后。若没有,则为一种正确排列,因为前面已经把横向纵向问题解决
int test(int y0,int y1,int y2,int y3,int y4,int y5,int y6,int y7)
{
int cmp,flag=0,y[8];
y[0]=y0;y[1]=y1;y[2]=y2;y[3]=y3;y[4]=y4;y[5]=y5;y[6]=y6;y[7]=y7;
for(cmp=1;cmp<8;cmp++)
{if(((y[0]+cmp-0)==y[cmp])||((y[0]-(cmp-0))==y[cmp])){flag=1;break;}}
if(flag==0)
{
for(cmp=2;cmp<8;cmp++)
{if(((y[1]+cmp-1)==y[cmp])||((y[1]-(cmp-1))==y[cmp])){flag=1;break;}}
}
if(flag==0)
{
for(cmp=3;cmp<8;cmp++)
{if(((y[2]+cmp-2)==y[cmp])||((y[2]-(cmp-2))==y[cmp])){flag=1;break;}}
}
if(flag==0)
{
for(cmp=4;cmp<8;cmp++)
{if(((y[3]+cmp-3)==y[cmp])||((y[3]-(cmp-3))==y[cmp])){flag=1;break;}}
}
if(flag==0)
{
for(cmp=5;cmp<8;cmp++)
{if(((y[4]+cmp-4)==y[cmp])||((y[4]-(cmp-4))==y[cmp])){flag=1;break;}}
}
if(flag==0)
{
for(cmp=6;cmp<8;cmp++)
{if(((y[5]+cmp-5)==y[cmp])||((y[5]-(cmp-5))==y[cmp])){flag=1;break;}}
}
if(flag==0)
{
cmp=7;
if(((y[6]+cmp-6)==y[cmp])||((y[6]-(cmp-6))==y[cmp])){flag=1;}
}
if (flag==0){return 1;}
else {return 0;}
}
void printx(int temp)
{
switch(temp)
{
case 1:
printf("X O O O O O O O\n");break;
case 2:
printf("O X O O O O O O\n");break;
case 3:
printf("O O X O O O O O\n");break;
case 4:
printf("O O O X O O O O\n");break;
case 5:
printf("O O O O X O O O\n");break;
case 6:
printf("O O O O O X O O\n");break;
case 7:
printf("O O O O O O X O\n");break;
case 8:
printf("O O O O O O O X\n");break;
default:
printf("\n");
}
}