https://www.luogu.com.cn/problem/P1784
题目描述数独是根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复。每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础,任何无解或多解的题目都是不合格的。
芬兰一位数学家号称设计出全球最难的“数独游戏”,并刊登在报纸上,让大家去挑战。
这位数学家说,他相信只有“智慧最顶尖”的人才有可能破解这个“数独之谜”。
据介绍,目前数独游戏的难度的等级有一道五级,一是入门等级,五则比较难。不过这位数学家说,他所设计的数独游戏难度等级是十一,可以说是所以数独游戏中,难度最高的等级他还表示,他目前还没遇到解不出来的数独游戏,因此他认为“最具挑战性”的数独游戏并没有出现。
输入格式一个未填的数独
输出格式填好的数独
输入输出样例输入 #1
8 0 0 0 0 0 0 0 0 0 0 3 6 0 0 0 0 0 0 7 0 0 9 0 2 0 0 0 5 0 0 0 7 0 0 0 0 0 0 0 4 5 7 0 0 0 0 0 1 0 0 0 3 0 0 0 1 0 0 0 0 6 8 0 0 8 5 0 0 0 1 0 0 9 0 0 0 0 4 0 0输出 #1
8 1 2 7 5 3 6 4 9 9 4 3 6 8 2 1 7 5 6 7 5 4 9 1 2 8 3 1 5 4 2 3 7 8 9 6 3 6 9 8 4 5 7 2 1 2 8 7 1 6 9 5 3 4 5 2 1 9 7 4 3 6 8 4 3 8 5 2 6 9 1 7 7 9 6 3 1 8 4 5 2 题目意思: 9×9盘面上的已知数字,推理出所有剩余空格的数字.类似是每一行做全排列。但是需要将行,列,还有小九宫格上中已经出现过的数字做记录。 想法: 利用dfs做枚举。找到唯一的答案。cx,cy,cblock记录行,列,小九宫格出现的数字。代码:
// P1784 数独// Created by majoe on 2020/4/29.//https://www.luogu.com.cn/problem/P1784#include using namespace std;const int maxn = 10;//cx,cy,cblock记录行,列,小九宫格出现的数字int mp[maxn][maxn],cx[maxn][maxn],cy[maxn][maxn],cblock[maxn][maxn];void dfs(int x, int y) {if (x == 9) {for (int i = 0; i cout dfs(x, y + 1);} else { // 如果x,y是0for (int i = 1; i cx[x][i] = 1;cy[y][i] = 1;cblock[x / 3 * 3 + y / 3][i] = 1;mp[x][y] = i;dfs(x, y + 1);//回溯mp[x][y] = 0;cx[x][i] = 0;cy[y][i] = 0;cblock[x / 3 * 3 + y / 3][i] = 0;}}}return;}int main() {for (int i = 0; i cin >> mp[i][j];//如果格子中有数,就将占位的数组填上if (mp[i][j]) {cx[i][mp[i][j]] = 1;cy[j][mp[i][j]] = 1;cblock[i / 3 * 3 + j / 3][mp[i][j]] = 1;}}}//从起点开始填。其实就是枚举所有的可能dfs(0, 0);return 0;}