POJ-2627-Sudoku-DFS

题目链接: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;
}


 

你可能感兴趣的:(sudoku,DFS,poj2676)