一个随机生成数独的程序

以下是一个生成数独的程序,利用深度优先遍历的方式。每次生成的数独是随机的。

对于判断一个点是否正确摆放的函数IsRightPlace(),要注意几个关键点。

//mySIZE是数独棋盘的边长,棋盘是mySIZE*mySIZE的大小
int mySIZE = 9;

void print(const vector<vector<int>> &num)
{
	for (int i = 0; i < mySIZE; i++)
	{
		for (int j = 0; j < mySIZE; j++)
		{
			cout << num[i][j] << " ";
		}
		cout << endl;
	}
}

bool IsRightPlace(vector<vector<int>> &num, int row, int col)
{
	int n = num[row][col];
	//注意i < row
	for (int i = 0; i < row; i++)
	{
		if (num[i][col] == n)
			return false;
	}
	//注意i < col
	for (int i = 0; i < col; i++)
	{
		if (num[row][i] == n)
			return false;
	}
	int row_start = row / 3;
	row_start *= 3;
	int row_end = row_start + 2;
	int col_start = col / 3;
	col_start *= 3;
	int col_end = col_start + 2;
	int i = row_start, j = col_start;
	//注意 k <= 8
	for (int k = 1; k <= 8; k++)
	{
		if (row != i || col != j)
		{
			if (num[i][j] == n)
				return false;
		}
		else
			break;
		if (j == col_end)
		{
			//注意j = col_start !不要搞错换行时列的起始点!
			j = col_start;
			i = i + 1;
		}
		else
		{
			j = j + 1;
		}
	}
	return true;
}

bool generate_core(vector<vector<int>> &num, int row, int col)
{
	
	vector<int> number;
	for (int i = 1; i <= 9; i++)
		number.emplace_back(i);
	while (!number.empty())
	{
		int randindex = rand() % number.size();
		int randnum = number[randindex];
		number.erase(number.begin() + randindex);
		num[row][col] = randnum;
		if (IsRightPlace(num, row, col) == false)
			continue;
		if (row == mySIZE - 1 && col == mySIZE-1)
		{
			return true;
		}
		int nextrow, nextcol;
		if (col == mySIZE-1)
		{
			nextrow=row + 1;
			nextcol = 0;
		}
		else
		{
			nextrow = row;
			nextcol = col + 1;
		}
		bool next = generate_core(num, nextrow, nextcol);
		if (next)
			return true;
	}
	if (number.empty())
	{
		num[row][col] = -5;
		return false;
	}		
}

void generate()
{
	vector<vector<int>> num(mySIZE, vector<int>(mySIZE, -1));
	srand((unsigned)time(NULL));
	if( generate_core(num, 0, 0) )
		print(num);
}


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个简单的 C 语言程序,用于生成数独游戏: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define SIZE 9 #define BLOCK_SIZE 3 // 检查某个数字是否可以放置在某个位置 int is_valid(int board[][SIZE], int row, int col, int num) { // 检查行是否合法 for (int i = 0; i < SIZE; i++) { if (board[row][i] == num) { return 0; } } // 检查列是否合法 for (int i = 0; i < SIZE; i++) { if (board[i][col] == num) { return 0; } } // 检查 3x3 方块是否合法 int block_row = row / BLOCK_SIZE; int block_col = col / BLOCK_SIZE; for (int i = block_row * BLOCK_SIZE; i < block_row * BLOCK_SIZE + BLOCK_SIZE; i++) { for (int j = block_col * BLOCK_SIZE; j < block_col * BLOCK_SIZE + BLOCK_SIZE; j++) { if (board[i][j] == num) { return 0; } } } return 1; } // 生成数独游戏 void generate(int board[][SIZE], int row, int col) { // 如果已经生成了 9 行,说明数独已经生成完毕,打印出来 if (row == SIZE) { for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { printf("%d ", board[i][j]); } printf("\n"); } printf("\n"); return; } // 如果已经到达某一行的末尾,就递归到下一行的第一列 if (col == SIZE) { generate(board, row + 1, 0); return; } // 如果当前位置已经有数字了,就递归到下一个位置 if (board[row][col] != 0) { generate(board, row, col + 1); return; } // 生成 1~9 的随机数,检查是否可以放置在当前位置 for (int num = 1; num <= SIZE; num++) { if (is_valid(board, row, col, num)) { board[row][col] = num; generate(board, row, col + 1); board[row][col] = 0; } } } int main() { srand(time(NULL)); int board[SIZE][SIZE] = {0}; generate(board, 0, 0); return 0; } ``` 该程序使用回溯法生成数独游戏,具体过程如下: 1. 从第一行第一列开始,逐个格子地填入数字; 2. 对于每个格子,随机生成 1~9 的数字,检查是否可以放置在当前位置; 3. 如果可以放置,就填入数字,并递归到下一列的格子; 4. 如果下一列的格子已经超过了第九列,就递归到下一行的第一列; 5. 如果已经生成了第九行,就说明数独已经生成完毕,打印出来; 6. 如果无法放置当前数字,就回溯到上一个格子,重新尝试其他数字。 注意,该程序生成的数独游戏可能有多个解,因此在实际应用中还需要进行进一步的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值