请求帮助解决c ++八皇后拼图代码的问题

时间:2010-09-28 19:42:45

标签: c++

我在eight queens problem的C ++代码中编写了一个函数。该程序应打印出所有92种可能的解决方案。我只能跑到40岁。不知道问题出在哪里。尝试调试,但我仍然卡住了。

#include "stdafx.h"
#include <cmath>
#include <iostream>
using namespace std;

bool ok(int board[8][8]){
    for(int c = 7; c > 0; c--){
        int r = 0;
        while(board[r][c] != 1 ){
            r++;
        } // while loop

        for(int i = 1; i <= c; i++){
            if(board[r][c-i] == 1)
                return false;
            else if (board[r-i][c-i] == 1)
                return false;
            else if (board[r+i][c-i] == 1)
                return false;
        } // for loop

    } // for loop
        return true;
} // ok

void print(int board[8][8], int count){
    cout << count << endl;
    for(int i = 0; i < 8; i++){
        for(int j = 0; j < 8; j++){
            cout << board[i][j];
        } // for loop 
        cout << endl;

    } // for loop

    cout << endl;
} // print board

int main (){

    int board[8][8]={0};
    int count = 0;
    for(int i0 = 0; i0 < 8; i0++)
       for(int i1=0; i1 < 8; i1++)
          for(int i2 = 0; i2 < 8; i2++)
         for(int i3 = 0; i3 < 8; i3++)
            for(int i4 = 0; i4 < 8; i4++)
           for(int i5 = 0; i5 < 8; i5++)
              for(int i6 = 0; i6 < 8; i6++)
                 for(int i7 = 0; i7 < 8; i7++){
                board[i0][0]=1;
                            board[i1][1]=1;
                            board[i2][2]=1;
                            board[i3][3]=1;
                            board[i4][4]=1;
                            board[i5][5]=1;
                            board[i6][6]=1;
                            board[i7][7]=1;

                            if(ok(board))print(board, ++count);

                            board[i0][0]=0;
                            board[i1][1]=0;
                            board[i2][2]=0;
                            board[i3][3]=0;         
                            board[i4][4]=0; 
                            board[i5][5]=0;
                            board[i6][6]=0;
                            board[i7][7]=0;

                                }
    return 0;
}

1 个答案:

答案 0 :(得分:14)

您的问题出在ok函数中。它有三个错误,都与矩阵的界限有关。第一个错误(如果有任何原因导致您接收太多解决方案),请访问:

for(int c = 7; c > 0; c--){

这绝不会检查第0列。测试应为c >= 0

其他两个导致不可预测行为的错误在这里:

    for(int i = 1; i <= c; i++){
        if(board[r][c-i] == 1)
            return false;
        else if (board[r-i][c-i] == 1)
            return false;
        else if (board[r+i][c-i] == 1)
            return false;
    } // for loop

这可能导致ok函数返回任意数量的误报。就我而言,使用这两个错误编译和运行程序不会产生任何解决方案。只有偶然的机会才能为您提供40种解决方案。

问题又出现了问题。 i变量从1升到c,因此c-i会按照预期从c-10移动。

但是,您没有检查r-ir+i是否仍然在矩阵的范围内。考虑r = 7i = 4的情况。然后,r+i = 11,它超过行的末尾。同样,如果r = 0i不是0,r-i将为负数并超出行的开头。

您需要添加其他检查以确保此循环中的测试中使用的行值在0到7的范围内。您可以利用C ++中逻辑运算符的短路行为来执行此操作,例如:

 else if (<test> && board[r-i][c-i] == 1)
仅当board[r-i][c-i]为真时,

才会检查<test>

我要离开将这两个错误的更正添加为练习,因为这很可能是一个家庭作业(如果是,你应该在问题中添加[homework]标签)。