c++ 随机生成数独(不保证唯一解)

本文介绍了一个简单的C++程序,用于生成数独初盘,但不保证生成的数独有唯一解。通过行和列的随机交换以及随机挖洞的方式来生成,交换限制在同一宫内以确保正确性。可以结合舞蹈链算法解决生成的数独问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给出一个最简单的生成数独初盘的程序,不保证有唯一解,终盘的正确性通过填充的过程来确定,可以用舞蹈链算法求解该数独得到其中一个解

随机生成的方法就算交换行和列然后随机挖洞

这里有一点要注意的就是交换的行和列必须处于同一宫中,要不然交换之后保证不了正确性

然后就是随机挖洞,可以直接随机一个坐标,或者用洗牌算法(类似于扫雷初盘的生成)

vector<vector<int> > generate(const int & level) {
	vector<vector<int> > mtx = 
	{ 	{9 ,8 ,7 ,6 ,5 ,4 ,3 ,2 ,1},
		{4 ,5, 6 ,2 ,3 ,1 ,7 ,8 ,9},
		{3 ,2 ,1 ,7 ,8 ,9 ,4 ,5 ,6},
		{1 ,3 ,5 ,8 ,6 ,7 ,2 ,9 ,4},
		{8 ,4 ,2 ,3 ,9 ,5 ,6 ,1 ,7},
		{6 ,7 ,9 ,1 ,4 ,2 ,5 ,3 ,8},
		{2 ,6 ,3 ,9 ,7 ,8 ,1 ,4 ,5},
		{7 ,9 ,4 ,5 ,1 ,3 ,8 ,6 ,2},
		{5 ,1 ,8 ,4 ,2 ,6 ,9 ,7 ,3} };
	int remain = -1;
	switch (level)
	{
	case 0:
		remain = 30;
		break;
	case 1:
		remain = 25;
		break;
	case 2:
		remain = 21;
		break;
	case 3:
		remain = 18;
		break;
	default:
		break;
	}
	for (int i = 0; i < 25; &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值