//=================================================
//=================================================
#include <stdio.h>
#define MAXQUEEN 8
int pad[MAXQUEEN][MAXQUEEN]={
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0
};
//放N个皇后的递归函数
int putqueen(int x,int y,int times)
{
int i,j,result=0;
if(times>MAXQUEEN)
return 1;
else
if(plce(x,y))//检查是否可放置皇后
{
pad[x][y]=1;// 放置皇后
for(i=0;i<MAXQUEEN;i++)
for(j=0;j<MAXQUEEN;j++)
{ //递归调用,放置下一个皇后
result+=putqueen(i,j,times+1);
if(result>0)
break;
}
if(result>0)//找到了解
return 1;
else
{
pad[x][y]=0;// 清除皇后
return 0;
}
}
else
return 0;
}
//检查皇后是否相互攻击
int plce(int x ,int y)
{
int x1,y1;
if(pad[x][y]!=0)//已放置皇后
return 0;
x1=x-1;
y1=y-1;
while(x1>=0&&y1>=0)
if(pad[x1--][y1--]!=0)//检查左上方
return 0;
x1=x+1;
y1=y+1;
while(x1<MAXQUEEN&&y1<MAXQUEEN)
if(pad[x1++][y1++]!=0)//检查右下方
return 0;
x1=x+1;
y1=y-1;
while(x1<MAXQUEEN&&y1>=0)//右上方
if(pad[x1++][y1--]!=0)
return 0;
x1=x-1;
y1=y+1;
while(x1>=0&&y1<MAXQUEEN)//检查左下
if(pad[x1--][y1++]=0)
return 0;
x1=x;
y1=y+1;
while(y1<MAXQUEEN)//检查下方
if(pad[x1][y1++]!=0)
return 0;
x1=x;
y1=y-1;
while(y1>=0)//检查上方
if(pad[x1][y1--]!=0)
return 0;
x1=x+1;
y1=y;
while(x1<MAXQUEEN)//检查右方
if(pad[x1++][y1]!=0)
return 0;
x1=x-1;
y1=y;
while(x1>=0)//检查左方
if(pad[x1--][y1]!=0)
return 0;
return 1;
}
//
void main()
{
int i,j;
putqueen(0,0,1);
printf("放置八皇后的棋盘图形:\n");
for(i=0;i<MAXQUEEN;i++)
{
for(j=0;j<MAXQUEEN;i++)
printf("%d",pad[j][j]);
printf("\n");
}
}
为什么
if(plce(x,y))//检查是否可放置皇后
这行中plce函数调用发生错误
int plce(int x ,int y)
{
这条显示类型不匹配