|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 Hermione 于 2017-12-5 12:20 编辑
- #include <iostream>
- using namespace std;
- int count;
- bool IsDanger(int r, int c, bool (*chess)[8])
- {
- bool flag1 = 0, flag2 = 0, flag3 = 0, flag4 = 0, flag5 = 0;
- int i, j;
- for(i = 0; i < 8; i++)
- if(chess[i][c])
- {
- flag1 = 1;
- break;
- }
- for(i = r, j = c; i >= 0 && j >= 0; i--, j--)
- if(chess[i][j])
- {
- flag2 = 1;
- break;
- }
- for(i = r, j = c; i >= 0 && j < 8; i--, j++)
- if(chess[i][j])
- {
- flag3 = 1;
- break;
- }
- for(i = r, j = c; i < 8 && j >= 0; i++, j--)
- if(chess[i][j])
- {
- flag4 = 1;
- break;
- }
- for(i = r, j = c; i < 8 && j < 8; i++, j++)
- if(chess[i][j])
- {
- flag5 = 1;
- break;
- }
- if(flag1 + flag2 + flag3 + flag4 + flag5 == 0)
- return 0;
- else
- return 1;
- }
- void EightQueen(int r, bool (*chess)[8])
- {
- bool chess2[8][8];
- for(int i = 0; i < 8; i++)
- for(int j = 0; j < 8; j++)
- chess2[i][j] = chess[i][j];
- if (r == 8)
- {
- cout << "case" << ++count << ":\n";
- for(int i = 0; i < 8; i++)
- {
- for(int j = 0; j < 8; j++)
- cout << chess2[i][j] << ' ';
- cout << endl;
- }
- }
- else
- {
- for(int j = 0; j < 8; j++)
- {
- if(!IsDanger(r, j, chess2))
- {
- for(int k = 0; k < 8; k++)
- chess2[r][k] = 0;
- chess2[r][j] = 1;
- EightQueen(r + 1, chess2);
- }
- }
- }
- }
- int main()
- {
- bool chess[8][8] = {0};
- EightQueen(0, chess);
- return 0;
- }
复制代码
很奇怪,第68,69行的for语句为什么不能删去。我想的是,本来棋盘就被初始化为0了,没把那行初始化为0,也可以,因为反正一开始就已经初始化为0了。我一开始没加,然后程序正常执行,但是什么都不输出,找了一个小时才发现是这错了。还是不能理解。
谢谢大家的帮助。
本帖最后由 tailor_long 于 2017-12-6 11:45 编辑
首先,咱们来测试一下如果将68, 69 行的for语句删除,会出现什么问题;
见图一
很明显,出现了不满足8皇后的条件的情况,也就是一行里面出现了多个1,所以到最后没有输出,因为按照你程序的判断方法,没有符合的8皇后
但是为什么会出现这种情况呢?
看你的程序的第48到51行,chess2 = chess1;也就是将当前的棋盘赋值给chess2
然后请看你的程序的66到71行,如果r != 8, 也就是当前棋盘没有判断到最后一行,那么判断当前行是否是dange的也就是
if(!IsDanger(r, j, chess2))
然后咱们再来看看你的IsDanger(r, j, chess2)函数,你分别对行、列、对角进行判断,都没问题,但是有一个地方有一个潜在的问题,那就是在您的IsDanger(r, j, chess2)函数中的每一判断,随便举个例子
- for(i = r, j = c; i < 8 && j >= 0; i++, j--)
- if(chess[i][j])
- {//判断斜对角有没有重复
- flag4 = 1;
- break;
- }
复制代码
这里的 是什么?是0 还是 1?这里就要看你的递归过程了,也就是第71行
EightQueen(r + 1, chess2);
你递归的是下一行,也就是r+1行,我们都知道初始棋盘全0,所以你的 必然为0,所以你的 IsDanger(r, j, chess2)函数判断的是当这个位置是0的时候,这一行有没有危险
如果没有危险的话,如果你将这一行的这个位置直接赋值为1,也就是没有68,69行,就可能会出现危险!所以你要将这一行全部清成0,然后对当前位置给1,这样才能保证当前棋盘没有危险
综上:
不知楼主大人懂了没?
|
|