您的位置:首页 > 其它

POJ 2676 Sudoku (数独 搜索)

2013-10-12 10:01 351 查看
题目链接:http://poj.org/problem?id=2676

开始以为直接DFS会超时,没想到竟然能AC,后来想想也对,只要搜索出一个结果就行了!

#include <string.h>
#include <algorithm>
#include <stdio.h>
#include <iostream>
using namespace std;
#define maxn 11
char map[maxn][maxn];
char tem[maxn][maxn];
bool row[maxn][maxn],colum[maxn][maxn],cir[maxn][maxn],flag;
int num;
bool is_ok(int i,int j,int num){
return row[i][num] && colum[j][num] && cir[((i-1)/3)*3+(j-1)/3+1][num];
}
int out(){
int i,j;
for(i=1;i<=9;i++){
for(j=1;j<=9;j++)
printf("%c",map[i][j]);
printf("\n");
}
}
int find_ans(int i,int j,int num){
if(num<=0){
flag=true;
out();
}
int k=i,r;
for(i;i<=9;i++){
if(i!=k) j=1;
for( ;j<=9;j++){
if(!flag && map[i][j]=='0'){
for(r=1;r<=9;r++)
if(is_ok(i,j,r)){
map[i][j]='0'+r;
row[i][r]=colum[j][r]=cir[((i-1)/3)*3+(j-1)/3+1][r]=false;
find_ans(i,j,num-1);
row[i][r]=colum[j][r]=cir[((i-1)/3)*3+(j-1)/3+1][r]=true;
map[i][j]='0';
}
return 0;
}
}
}
}
int main(){
int i,j,k,t;
scanf("%d",&t);
while(t--){
memset(row,1,sizeof(row));
memset(colum,1,sizeof(colum));
memset(cir,1,sizeof(cir));
num=0;
flag=false;
for(i=1;i<=9;i++)
for(j=1;j<=9;j++){
cin>>map[i][j];
if(map[i][j]!='0'){
row[i][map[i][j]-'0']=false;
colum[j][map[i][j]-'0']=false;
cir[((i-1)/3)*3+(j-1)/3+1][map[i][j]-'0']=false;
}
else num++;
}
memcpy(tem,map,sizeof(tem));
find_ans(1,1,num);
if(flag==false){
for(i=1;i<=9;i++){
for(j=1;j<=9;j++)
printf("%c",map[i][j]);
printf("\n");
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj 搜索