题目链接:http://poj.org/problem?id=2676
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<queue>
#include<map>
#include<stack>
#include<set>
#include<vector>
#include<algorithm>
#define LL long long
using namespace std;
struct node
{
int r,c;
}point[85];
int cnt,flag=0;
int a[10][10];
int row[10][10],col[10][10],block[3][3][10];
bool isok(int r,int c,int num) // 判断是否可以放num数字;
{
return (!row[r][num]&&!col[c][num]&&!block[r/3][c/3][num]);
}
void flagall(int r,int c,int num,int f) // 给行列,宫格标记
{
row[r][num]=f;
col[c][num]=f;
block[r/3][c/3][num]=f;
}
void dfs(int n)
{
int r=point[n].r,c=point[n].c;
if(flag) return;
if(n==cnt){
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
printf("%d",a[i][j]);
}
printf("\n");
}
flag=1;
return;
}else{
for(int i=1;i<=9;i++){
if(isok(r,c,i)){
a[r][c]=i;
flagall(r,c,i,1); // 标记为1;
dfs(n+1);
a[r][c]=0;
flagall(r,c,i,0); // 标记为0;
}
}
}
return ;
}
int main()
{
int t;
char str[15];
scanf("%d",&t);
while(t--){
cnt=0,flag=0;
memset(row,0,sizeof(row));
memset(col,0,sizeof(col));
memset(block,0,sizeof(block));
for(int i=0;i<9;i++){
scanf("%s",&str); // 字符串,一个一个分开处理;
for(int j=0;j<strlen(str);j++){
a[i][j]=str[j]-'0';
if(!a[i][j]) point[cnt].r=i,point[cnt++].c=j;
else{
flagall(i,j,a[i][j],1);
}
}
}
dfs(0);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/wlxsq/article/details/46983995