#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <map>
#include <set>
using namespace std;
const int MAXSIZE = 9;
int road[MAXSIZE][MAXSIZE];
int testcase;
bool canput(int x, int y, int val){
// 首先看当前 3×3区域是否可以放置
int ax = x/3, ay = y/3;
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
if (road[3*ax+i][3*ay+j] == val)
return false;
}
}
//检查这一行
for (int i = 0; i < MAXSIZE; ++i) {
if (road[x][i] == val)
return false;
}
//检查这一列
for (int i = 0; i < MAXSIZE; ++i) {
if (road[i][y] == val)
return false;
}
return true;
}
void dfs(int x, int y){
// 修改行列
if (y==MAXSIZE) x+=1, y=0;
// 检查是否结束
if (x == MAXSIZE){
for (int i = 0; i < MAXSIZE; ++i) {
for (int j = 0; j < MAXSIZE; ++j) {
cout<<road[i][j];
}
cout<<endl;
}
throw "err";
}
// 首先看是否走过
if (road[x][y]){
dfs(x, y+1);
} else{
// 没有走过,从0-9试探是否可以走
for (int i = 1; i <=9 ; ++i) {
if (canput(x, y, i)){
road[x][y] = i;
dfs(x, y+1);
road[x][y] = 0;
}
}
}
}
int main(){
// freopen("../in.txt", "r", stdin);
cin>>testcase;
char ch;
while (testcase--){
for (int i = 0; i < MAXSIZE; ++i) {
for (int j = 0; j < MAXSIZE; ++j) {
cin>>ch;
road[i][j] = ch-'0';
}
}
try {
dfs(0, 0);
}catch (...){
}
}
}
POJ 2676
最新推荐文章于 2019-08-08 13:13:11 发布