题目
九宫格问题,也有人叫数独问题。给你一个数独,让你填数:
- 每行的九个数字互不相同;
- 每列的九个数字各不相同;
- 被分成的3*3的小矩阵中的九个数字互不相同;
输出完成后的数表,若不能满足上述条件,则输出原图。
样例
样例输入
1
103000509
002109400
000704000
300502006
060000050
700803004
000401000
009205800
804000107
样例输出
143628579
572139468
986754231
391542786
468917352
725863914
237481695
619275843
854396127
AC代码
#include <stdio.h>
#include <iostream>
using namespace std;
int sum, map[12][12];
int flag = 0;
int p[100];
int input() //输入
{
sum = 0; // 记录行数
string str;
int i, j;
for (i = 1; i <= 9; i++) // 有9行输入
{
cin >> str; // 每一行用一个字符串代表
str.insert(0, 1, '$'); // 因为字符串的输入时从第0位输入的,我们的程序又想便于分析而从第一位计算,所以使用insert函数人为的在第0位插入一个字符$,后面的字符依次后移。 string.insert()函数的用法:https://www.cnblogs.com/mxw000120/p/13835219.html
for (j = 1; j <= 9; j++) // 这一层循环的作用是寻找字符'0'的位置
{
if (str[j] == '0')
p[sum++] = i * 10 + j; //记录这一行字符'0'出现的位置
map[i][j] = str[j] - '0'; //正常的数字
}
}
}
//输出
void output()
{
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= 9; j++)
{
cout << map[i][j];
}
cout << endl;
}
}
int check(int res, int x, int y) // 判断
{
//进行行列判断
for (int i = 1; i <= 9; i++)
{
if (res == map[x][i] || res == map[i][y])
return 0;
}
x = (x - 1) / 3 * 3 + 1;
y = (y - 1) / 3 * 3 + 1;
// 小9方格内判断
for (int i = x; i <= x + 2; i++)
for (int j = y; j <= y + 2; j++)
if (res == map[i][j])
return 0;
return 1;
}
void dfs(int k)
{
//找到字符'0'的位置,从那里开始搜索
int x = p[k] / 10;
int y = p[k] % 10;
// sum为一个样例中'0'的个数。如果所有的字符'0'都已处理完毕,则可以输出这个矩阵了
if (k == sum)
{
flag = 1;
output();
return;
}
for (int i = 1; i <= 9; i++)
{
//关于这个字符'0'可以填那个数字,进行搜索
if (check(i, x, y) && !flag)
{
map[x][y] = i;
dfs(k + 1);
map[x][y] = 0;
}
}
return;
}
int main()
{
int t;
cin >> t;
while (t--)
{
input();
flag = 0;
//从第一个字符'0'开始处理
dfs(0);
}
return 0;
}