这段代码是一个更大的项目的一部分,但我试图让这一点先工作,因为之后的一切都是微不足道的。基本上我正在尝试使用递归来填充大小为12 x 6的2D数组,其中包含1-12的随机数。诀窍是,数字不能在列或行中重复。代码适用于更大的数字池或更小的数组,但是当我使用这些条件运行它时,它会抛出异常大约一半的时间。我很确定它遇到了无法找到符合条件的数字的情况,所以它只是无限循环,但我不知道如何防止它。
抛出异常的一个例子 -
测试中0x01232479处的未处理异常 - 填充数组Recursively.exe:> 0xC00000FD:堆栈溢出(参数:0x00000001,0x00602FE0)。
测试中的0x0FF0DB39(ucrtbased.dll)抛出异常 - 填充数组> Recursively.exe:0xC0000005:访问冲突写入位置0x00600FFC。
以下是代码:
#include<iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
const int X = 12;
const int Y = 6;
//recursion function prototype
int randomArrayFunction(int Array[X][Y], int posParX, int PosParY);
int main() {
//declarations
int randomArray[X][Y];
int posX = 0;
int posY = 0;
srand(static_cast<unsigned int>(time(NULL)));
randomArrayFunction(randomArray, posX, posY);
for (int i = 0; i < X; i++) {
for (int j = 0; j < Y; j++) {
cout << " " << randomArray[i][j];
}
cout << endl;
}
}
//recursion function defintion
int randomArrayFunction(int Array[X][Y], int posParX, int posParY) {
int prevPosX = posParX - 1;
int prevPosY = posParY - 1;
int randomNumber = rand() % 12;
if (posParY == Y)
return 0;
Array[posParX][posParY] = randomNumber;
//Checks all previous numbers in a row for duplicates and reassigns a random number if one is found
while (prevPosX >= 0) {
if (posParX != 0 && Array[posParX][posParY] == Array[prevPosX][posParY]) {
Array[posParX][posParY] = randomNumber;
return randomArrayFunction(Array, posParX, posParY);
}
prevPosX--;
}
//Checks all previous numbers in a column for duplicates and reassigns a random number if one is found
while (prevPosY >= 0) {
if (posParY != 0 && Array[posParX][posParY] == Array[posParX][prevPosY]) {
Array[posParX][posParY] = randomNumber;
return randomArrayFunction(Array, posParX, posParY);
}
prevPosY--;
}
posParX++;
if (posParX == X) {
posParY++;
posParX = 0;
}
return randomArrayFunction(Array, posParX, posParY);
}
我还是比较陌生的编码,并且没有太多的递归经验,所以任何人都可以提供的帮助将非常感激。
答案 0 :(得分:0)
您遇到的问题是,有时您会用完数字来填充数组中的后续条目。为了获得足够的数量,您至少需要(X + Y - 1
)个数字。这是因为在填写最后一个条目时,行中已有X - 1
个数字,并且该列中可能使用Y - 1
个不同的数字。由于您已经使用了X - 1 + Y - 1
个数字,因此您需要多一个来填充数组。
使用循环而不是递归可以更好地解决此问题。我不会理解为什么现在使用rand()
不是一个好主意。