数独 | ||||||
| ||||||
Description | ||||||
数独应该是一个大家都玩过的游戏,说的就是在一个9*9的方格中填入一些数字,符合以下规则: 1.每一列或每一行中1-9只能出现一次。 2.这个数独划分成的9个小的3*3的方格矩阵内,从1-9的每个数只能出现一次。 | ||||||
Input | ||||||
输入数据的第一行包括一个整数T,表示有T组测试数据。 每组数据由9行组成,每行由9个整数或者*组成,其中*表示空白的格子。
| ||||||
Output | ||||||
每组数据输出9行,每行9个整数,表示整个数独。 每两组输出之间有一个空行。
| ||||||
Sample Input | ||||||
1 *864*2*3* **3**819* **2**9**8 7*9**52** 6**92***3 **17**8*9 3**2**7** *671**9** *1*5*732* | ||||||
Sample Output | ||||||
986412537 543678192 172359648 739845261 658921473 421763859 395286714 267134985 814597326 | ||||||
Hint | ||||||
数据保证答案唯一。 |
用dfs暴力搜索就行
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int MAX = 10;
int mapp[MAX+9][MAX+9];
bool flag;
bool pan(int num,int x)//判断当前数字是否重复
{
int hang = num/9;
int lie = num%9;
for(int h = 0;h < 9;h++){
if(mapp[h][lie] == x)
return false;
}
for(int l = 0;l < 9;l++){
if(mapp[hang][l] == x)
return false;
}
int fhang = 3*(hang/3);
int flie = 3*(lie/3);
for(int h = fhang;h < fhang+3;h++){
for(int l = flie;l < flie+3;l++){
if(mapp[h][l] == x)
return false;
}
}
return true;
}
void dfs(int num)//从第0格开始搜,一直到第80格
{
if(num > 80 || flag){
flag = true;
return ;
}
int hang = num/9;
int lie = num%9;
if(mapp[hang][lie] != 0){
dfs(num+1);
if(flag)
return ;
}
else{
for(int i = 1;i <= 9;i++){
if(pan(num,i)){
mapp[hang][lie] = i;
dfs(num+1);
if(flag)
return ;
mapp[hang][lie] = 0;
}
}
}
}
int main()
{
int t;
scanf("%d",&t);
for(int Case = 1;Case <= t;Case++){
flag = false;
memset(mapp,0,sizeof(mapp));
for(int i = 0;i < 9;i++){
getchar();
for(int j = 0;j < 9;j++){
char word;
scanf("%c",&word);
if(word == '*')
mapp[i][j] = 0;
else mapp[i][j] = word-'0';
}
}
dfs(0);
for(int i = 0;i < 9;i++){
for(int j = 0;j < 9;j++){
printf("%d",mapp[i][j]);
}printf("\n");
} printf("\n");
}
return 0;
}