Обращение за помощью для устранения неполадок кода головоломки C ++ Eight - PullRequest
5 голосов
/ 28 сентября 2010

Я написал функцию в коде 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 Ответ

14 голосов
/ 28 сентября 2010

Ваша проблема в функции 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-1 до 0, как и предполагалось.

Однако вы не проверяете, что r-i и r+i остаются в пределах матрицы.Рассмотрим случай, когда r = 7 и i = 4.Затем r+i = 11, который проходит за конец ряда.Точно так же, если r = 0 и i отличны от 0, r-i будет отрицательным и будет проходить после начала строки.

Вам необходимо добавить дополнительные проверки, чтобы убедиться, что значения строкииспользуемые в тестах в этом цикле находятся в диапазоне от 0 до 7. Для этого можно использовать поведение короткого замыкания логических операторов в C ++, например:

 else if (<test> && board[r-i][c-i] == 1)

будет проверять board[r-i][c-i] только если <test> истинно.

Я оставляю добавление исправлений к этим вторым двум ошибкам в качестве упражнения для вас, поскольку это, скорее всего, будет домашним заданием (и если это так,Вы должны добавить тег [домашнее задание] к вопросу).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...