数独
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
数独是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个3*3宫内的数字均含1-9,不重复。 每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础,任何无解或多解的题目都是不合格的。
有一天hrdv碰到了一道号称是世界上最难的数独的题目,作为一名合格的程序员,哪能随随便便向困难低头,于是他决定编个程序来解决它。。

-
输入
- 第一行有一个数n(0< n <100),表示有n组测试数据,每组测试数据是由一个9*9的九宫格构成,0表示对应的格子为空 输出
- 输出一个9*9的九宫格,为这个数独的答案 样例输入
-
1 0 0 5 3 0 0 0 0 0 8 0 0 0 0 0 0 2 0 0 7 0 0 1 0 5 0 0 4 0 0 0 0 5 3 0 0 0 1 0 0 7 0 0 0 6 0 0 3 2 0 0 0 8 0 0 6 0 5 0 0 0 0 9 0 0 4 0 0 0 0 3 0 0 0 0 0 0 9 7 0 0
样例输出
-
1 4 5 3 2 7 6 9 8 8 3 9 6 5 4 1 2 7 6 7 2 9 1 8 5 4 3 4 9 6 1 8 5 3 7 2 2 1 8 4 7 3 9 5 6 7 5 3 2 9 6 4 8 1 3 6 7 5 4 2 8 1 9 9 8 4 7 6 1 2 3 5 5 2 1 8 3 9 7 6 4
来源
- 原创 上传者
- TC_胡仁东
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<string>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#include<set>
#include<map>
#include<cstdio>
#define mes(x) memset(x, 0, sizeof(x))
typedef long long ll;
#define Pii pair<int, int>
#define Pll pair<ll, ll
#define INF 1e9+7
using namespace std;
const int maxn = 50005;
int mymap[9][9];
int flag = 0;
bool isNot(int x, int y, int num)//判断该行 该列 该九宫格有无重复数字
{
int i, j, m, n;
m = x/3*3; //row
n = y/3*3; //column
for(i = 0; i < 9; ++i)
{
if(mymap[x][i] == num || mymap[i][y] == num)
return false;
}
for(i = m; i < m+3; ++i)
for(j = n; j < n+3; ++j)
{
if(mymap[i][j] == num)
return false;
}
return true;
}
void print()
{
for(int i = 0; i < 9; ++i)
{
for(int j = 0; j < 9; ++j)
{
cout << mymap[i][j] << ' ';
}
cout << endl;
}
flag = 1; //标记找到
return;
}
void dfs(int x, int y)
{
if(flag) //find
{
return;
}
if(9 == x&&0 == y) //print
{
print();
}
if(y == 9) //如果该行填满 换行
{
dfs(x+1, 0);
}
if(mymap[x][y]) //该格有数 不填,下一个
{
dfs(x, y+1);
}
else //可填
{
for(int i = 1; i <= 9; ++i)
{
if(isNot(x, y, i))//判断
{
mymap[x][y] = i;
dfs(x, y+1);
mymap[x][y] = 0; //回溯关键
}
}
}
}
int main()
{
// freopen("/home/ostreambaba/桌面/input.txt", "r", stdin);
// freopen("/home/ostreambaba/桌面/output.txt", "w", stdout);
int n;
cin >> n;
while(n--)
{
for(int i = 0; i < 9; ++i)
for(int j = 0; j < 9; ++j)
{
cin >> mymap[i][j];
}
dfs(0, 0);
memset(mymap, 0, sizeof(mymap));
flag = 0;
}
return 0;
}

452

被折叠的 条评论
为什么被折叠?



