数独解算器(第二版)
“数独”(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(); } |
原创文章,转载请注明: 转载自耍下
本文链接地址: 数独解算器(第二版)
| 这篇文章由Mr. Shu于2010年01月30日 下午 3:30发表在C/C++。你可以订阅RSS 2.0。 也可以发表评论或引用到你的网站。 |


大约6月前
呵呵,我还是用不着。
大约6月前
找张报纸来做就知道了,还是挺好玩的。