사용자가 int N을 입력하면 동일한 행이나 열에 중복이없는 Nx 눈금을 만들 수 있도록 간단한 알고리즘을 작성했습니다. 이 알고리즘은 때로 낮은 숫자로 작동하지만 세그먼트 오류가 발생합니다. 이 오류는 격자 배열의 요소를 설정하는 행의 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 + 1; 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);
}
}
}
팁 : C++에서 C 스타일 배열 사용을 중단하고 대신'std :: vector'를 사용하십시오. – tadman
** 경고 ** : ['rand()'는 유해한 것으로 간주됩니다 (https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful). 실제로 임의의 값을 생성하는 적절한 [표준 라이브러리의 난수 생성기] (http://en.cppreference.com/w/cpp/numeric/random). 랜덤 시드 시드로'time (NULL)'을 사용하면 동일한 초에서 실행될 때 동일한 결과가 생성되며, 많은 플랫폼에서'rand()'는 [거의 * 무작위로] (http : /dilbert.com/strip/2001-10-25). – tadman
코드를 디버그하는 방법을 배울 시간 – UnholySheep