POJ2676-搜索-Sudoku

来源:互联网 发布:淘宝卖家怎么搞到发票 编辑:程序博客网 时间:2024/06/16 00:33

https://vjudge.net/problem/POJ-2676
一看这道题,就感觉很难。。
其实也还好,和我大致想象的差不多,
不过没有想到他的存储方式。
和搜索的技巧。
有一个问题,我把输入范围改成 1-9,就错了,一直不明白为什么。。该改的地方都改了。

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;/*我看了一下题,就觉得自己肯定不会这道题。。其实仔细想想,还是可以写的。暴力搜索而已,剪枝更是异常明白,纯码力题。*/const int maxn=11;int h[maxn];int l[maxn];int a[maxn][maxn];int border[maxn];bool flag;int judge( int m , int n ){    if ( m>=0 && m<3 && n>=0 && n<3 )        return 0;    else if ( m>=0 && m<3 && n>=3 && n<6 )        return 1;    else if ( m>=0 && m<3 && n>=6 && n<9 )        return 2;    else if ( m>=3 && m<6 && n>=0 && n<3 )        return 3;    else if ( m>=3 && m<6 && n>=3 && n<6 )        return 4;   else  if ( m>=3 && m<6 && n>=6 && n<9 )        return 5;    else if ( m>=6 && m<9 && n>=0 && n<3 )        return 6;    else if ( m>=6 && m<9 && n>=3 && n<6 )        return 7;    else if ( m>=6 && m<9 && n>=6 && n<9 )        return 8;}int init(){     memset(l,0,sizeof(l));     memset(h,0,sizeof(h));     memset(a,0,sizeof(a));     memset(border,0,sizeof(border));     int sum=0;     for(int i=0;i<9;i++)         for(int j=0;j<9;j++){            scanf("%1d",&a[i][j]);             if(a[i][j]){                h[i]|=1<<a[i][j];                l[j]|=1<<a[i][j];                border[judge(i,j)]|=1<<a[i][j];             }             else                 sum++;         }         return sum;}void dfs ( int m , int n , int left ){    int i,j;    if ( m==9 || left==0 )    {        if ( !left )            flag=true;        return;    }    else    if (a[m][n])    {        if ( n==8 )                dfs(m+1,0,left);            else                dfs(m,n+1,left);    }    else    {        for ( i=1 ; i<10 && !flag ; i++ )        {            if ( !((h[m]>>(i))&1) && !( (l[n]>>(i))&1) && !( (border[judge(m,n)]>>(i))&1) )            {                h[m]|=1<<(i),l[n]|=1<<(i);                border[judge(m,n)]|=1<<(i);                a[m][n]=i;                if ( n==8 )                    dfs(m+1,0,left-1);                else                    dfs(m,n+1,left-1);                if ( !flag )                {                      a[m][n]=0;                    h[m]^=1<<(i),l[n]^=1<<(i),border[judge(m,n)]^=1<<(i);                }                else                    return;            }        }    }}int main(){    int t;     while(~scanf("%d",&t)){           while(t--){           flag=false;           int all=init();           dfs(0,0,all);           for(int i=0;i<9;i++){               for(int j=0;j<9;j++)                  printf("%d",a[i][j]);                cout<<endl;           }           }     }    return 0;}
原创粉丝点击