C ++递归以检测网格的行和列中的重复项

时间:2017-04-27 19:46:30

标签: c++ recursion

我编写递归算法以获取用户输入N并制作N x N网格,其中相同的数字在行或列上不出现两次。几乎所有的东西都在工作,并且副本不会出现在列中,但我在排队工作时遇到了麻烦。

我检查行中重复项的代码是函数noRowDuplicates。重复仍在出现,偶尔也会出现分段错误,但我不确定原因。

提前感谢您的帮助!

// Author: Eric Benjamin
// This problem was solved using recursion. fill() is the recursive function.


#include <iostream>
#include <cstdlib>
#include <time.h>

using namespace std;

void fillOptions();
void fill(int arrayPosition);
int inputNum;
int gridSize;
int *grid;
int allOptionsSize = 0;
int *allOptions;

int main() {
    cout << "Please enter a number!" << endl;
    cin >> inputNum;
    gridSize = inputNum * inputNum;

    grid = new int[gridSize];
    allOptions = new int[inputNum];
    for (int i = 0; i < inputNum; i++) {
         allOptions[i] = i + 1;
         allOptionsSize++;
    }

    srand((unsigned)time(0));
    fill(0);

    delete[] grid;
    delete[] allOptions;
    return 0;
}

bool noColumnDuplicates(int arrPosition, int valueToCheck) {
    for (int i = 1; i < inputNum; i++) {
        if (arrPosition - (inputNum * i) >= 0) {
            if (grid[arrPosition - (inputNum * i)] == valueToCheck) {
                return false;
            }
        }
    }
    return true;
}

bool noRowDuplicates(int arrPosition, int valueToCheck) {
    int rowPosition = arrPosition % inputNum; // 0 to num - 1
    if (rowPosition > 0) {
        for (int p = 1; p < rowPosition; p++) {
            if (grid[arrPosition - p] == valueToCheck) {
                return false;
            }
        }
    }
    return true;
}

void fill(int arrayPosition) {
    if (arrayPosition < gridSize) {
        int randomPosition = rand() % allOptionsSize;
        grid[arrayPosition] = allOptions[randomPosition];
        if (noColumnDuplicates(arrayPosition, grid[arrayPosition])) {
            if (noRowDuplicates(arrayPosition, grid[arrayPosition])) {
                if (arrayPosition % inputNum == 0) {
                    cout << endl;
                }
                cout << grid[arrayPosition] << " ";
                fill(arrayPosition + 1);
            } else {
                fill (arrayPosition);
            }
        } else {
            fill(arrayPosition);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

noRowDuplicates从不测试行的第一个元素,这在您尝试填充行的第一个元素时是有意义的,但不是任何其他时间。