“数独”(sudoku)一词来自日语,意思是“单独的数字”或“只出现一次的数字”。概括来说,它就是一种填数字游戏。但这一概念最初并非来自日本,而是源自拉丁方块,它是十八世纪的瑞士数学家欧拉发明的。出生于1707年的欧拉被誉为有史以来最伟大的数学家之一。
标准数独的规则为:数独每行、每列及每宫填入数字1-9且不能重复。
在家里没事做,开着手机玩数独。玩着玩着就想把那个解密器做出来。效果还不错,希望大家喜欢。

自带9个题目,各类题目3个。
这次主要是改进了界面和增加了暴力破解。应该没有破解不了的题目了。


建议代码,速度超快。

#include <windows.h>
#include <stdio.h>
#include <time.h>
 
char sd[81];
bool isok = false;
 
//显示数独
void show()
{
	if (isok) puts("求解完成");
	else puts("初始化完成");
 
	for (int i = 0; i < 81; i++)
	{
		putchar(sd[i] + '0');
		if ((i + 1) % 9 == 0) putchar('\n');
	}
	putchar('\n');
}
 
//读取数独
bool Init()
{
	FILE *fp = fopen("in.txt", "rb");
	if (fp == NULL) return false;
	fread(sd, 81, 1, fp);
	fclose(fp);
	for (int i = 0; i < 81; i++)
	{
		if (sd[i] >= '1' && sd[i] <= '9') sd[i] -= '0';
		else sd[i] = 0;
	}
	show();
	return true;
}
 
//递归解决数独
void force(int k)
{
	if (isok) return;
	if (!sd[k])
	{
		for (int m = 1; m <= 9; m++)
		{
			bool mm = true;
			for (int n = 0; n < 9; n++)
			{
				if ((m == sd[k/27*27+(k%9/3)*3+n+n/3*6]) || (m == sd[9*n+k%9]) || (m == sd[k/9*9+n]))
				{
					mm = false;
					break;
				}
			}
			if (mm)
			{
				sd[k] = m;
				if (k == 80)
				{
					isok = true;
					show();
					return;
				}
				force(k + 1);
			}
		}
		sd[k] = 0;
	}
	else
	{
		if (k == 80)
		{
			isok = true;
			show();
			return;
		}
		force(k + 1);
	}
}
 
int main()
{
	system("CLS");
	if (Init())
	{
		double start = clock();
		force(0);
		printf("耗时%.0fms", clock() - start);
	}
	else puts("初始化错误");
	getchar();
}

原创文章,转载请注明: 转载自耍下
本文链接地址: 数独解算器(第二版)