问题描述
- C++中的八皇后问题,编译通过了,但执行的时候为什么直接显示按任意键返回
-
#include//8*8的棋盘
#define max 8
int i,j;
int e,s;
char queen[max][max];int main()
{
void fz();
void put();
void check();
void show();
void checkandput();
void checkagain();
for(i=0;i<max;i++)
for(j=0;j<max;j++)
queen[i][j]='a';checkandput();//开始运算 return 0;
}
void fz()//将位置上的值赋为Q
{
queen[i][j]='Q';}
void show()//打印当前的棋盘棋盘
{
int m,n;
for(m=0;m<max;m++)
{
for(n=0;n<max;n++)
printf(" %c ",queen[m][n]);
printf("n");} printf("n");
}
void put()//判断按照那种方式进行回溯
{
void fz();
void check();
void checkagain();
s=0;
if(e==0 && i!=8 && j<=8)
s=1;
else if(e==1 && j<8 && i!=8)//不符合调节是在下一列找
{
j++;
check();} else if(e==1 && j==8 && i!=8)//回溯到上一行 { i--; checkagain(); } else if(i==8 && e==0 && j<8)//当到最后一行并且放下了棋子的时候,先将该位置赋值,在打印棋盘,最后看下一个位置是否符合 { fz(); show(); queen[i][j]=' '; j++; check(); } else if(i==8 && e==0 && j==8) { fz(); show(); queen[i][j]=' '; i--; checkagain(); } else if(i==8 && e==1 && j<8) { j++; check(); } else if(i==8 && e==1 && j==8) { i--; checkagain(); }
}
void checkandput()//检查是否能打印
{
void check();
for(i=0;i<max;i++)
{
j=0;
check();
if(s==1)
fz();
}}
void check()//判断是否符合条件能不能放下棋子
{
int m,n;
void put();
e=0;
for(m=0;m<max;m++)//判断正斜行
for(n=0;n<max;n++)
if((i-j)==(m-n) && queen[m][n]=='Q')
{e=1; break; } for(m=0;m<max;m++)//判断负斜行 for(n=0;n<max;n++) if((n+m)==(i+j) && queen[m][n]=='Q') { e=1; break; } for(m=0;m<max;m++)//判断一列 if(queen[m][j]=='Q') { e=1; break; } for(n=0;n<max;n++)//判断一行 if(queen[i][n]=='Q') { e=1; break; } put();
}
void checkagain()//当在一行中都没有可以放棋子的位置的时候,就回溯到上一列去寻找下一个可以放棋子的位置
{
void check();
e=0;
for(j=0;j<max;j++)
if(queen[i][j]=='Q')
{
queen[i][j]==' ';
j++;
break;
}
check();}
解决方案
没耐心看代码,执行没反应,那就是语法正确,逻辑错误咯,大脑中的思路又先入为主,以
为代码是按照自己的意思来运行,实际上却有偏差,自己好好找找
解决方案二:
参考代码
https://github.com/707wk/Practice-Code-For-CPP/blob/master/20150326001.c