所以这个想法是它在主要的9x9阵列中接收,并在行周围交换。它只能交换1-3行1-3,3-6与4-6和7-9交换7-9。出于某种原因,每隔一段时间,它会从4-6换掉一个,从7-9换掉一个,有时候它会给我7-9行之一的绝对垃圾。我花了2个小时的大部分时间试图找出在这种情况下使用rand()的正确方法,我确信我没有正确地做到这一点。有什么想法吗?
#include <iostream>
#include <time.h>
#include <stdlib.h>
using namespace std;
void printSudoku(int square[9][9]) // Prints out the 9x9 array
{
for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 9; j++)
{
cout << square[i][j];
}
cout << endl;
}
}
void swapRows(int square[9][9]) // Randomly generates numbers, within bounds, and swaps those rows with each other
{
int temp[1][9];
srand(time(NULL));
int n = (rand() % 2) + 0;
int m = (rand() % 2) + 0;
for(int i = 0; i < 9; i++)
{
temp[0][i] = square[n][i];
}
for(int j = 0; j < 9; j++)
{
square[n][j] = square[m][j];
}
for(int k = 0; k < 9; k++)
{
square[m][k] = temp[0][k];
}
int a = (rand() % 5) + 3;
int b = (rand() % 5) + 3;
for(int i = 0; i < 9; i++)
{
temp[0][i] = square[a][i];
}
for(int j = 0; j < 9; j++)
{
square[a][j] = square[b][j];
}
for(int k = 0; k < 9; k++)
{
square[b][k] = temp[0][k];
}
int c = (rand() % 8) + 6;
int d = (rand() % 8) + 6;
for(int i = 0; i < 9; i++)
{
temp[0][i] = square[c][i];
}
for(int j = 0; j < 9; j++)
{
square[c][j] = square[d][j];
}
for(int k = 0; k < 9; k++)
{
square[d][k] = temp[0][k];
}
}
int main() {
int square[9][9] = {1,2,3,4,5,6,7,8,9,
4,5,6,7,8,9,1,2,3,
7,8,9,1,2,3,4,5,6,
2,3,4,5,6,7,8,9,1,
5,6,7,8,9,1,2,3,4,
8,9,1,2,3,4,5,6,7,
3,4,5,6,7,8,9,1,2,
6,7,8,9,1,2,3,4,5,
9,1,2,3,4,5,6,7,8,};
printSudoku(square);
swapRows(square);
cout << endl;
printSudoku(square);
return 0;
}
答案 0 :(得分:3)
当您致电rand()
时,它会为您提供0到RAND_MAX
之间的数字。当您使用类似rand() % 8
的内容时,它会为您提供0到7之间的随机数。这比您希望随机数跨越的范围更大。您只希望随机数为0到2(0,1或2),然后为第一行添加偏移量。
例如,(rand() % 8) + 6
为您提供0 + 6 = 6到7 + 6 = 13的随机数。相反,使用(rand() % 3) + 6
给你0 + 6 = 6到2 + 6 = 8.