首页 > 代码库 > HDU 1426 Sudoku Killer

HDU 1426 Sudoku Killer

数独(DFS)。


很忧伤的一道题,先是剪枝的三个数组开成[9][9]导致 越界了WA。


然后就是每两组输出之间有空行,但是最后一组后面不能输出空行。PE好多次。


#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<stack>
#include<iostream>
#include<list>
#include<set>
#include<cmath>

#define INF 0x7fffffff
#define eps 1e-8
#define LL long long
#define PI 3.141592654
#define CLR(a,b) memset(a,b,sizeof(a))
#define FORi(n) for(int i=0;i<n;i++)
#define FORj(n) for(int j=0;j<n;j++)
#define FORk(n) for(int k=0;k<n;k++)
#define debug puts("==fuck==")
#define acfun std::ios::sync_with_stdio(false)

#define SIZE 1000+10
using namespace std;

int g[9][9];
bool visx[9][10],visy[9][10],box[9][10];
void show()
{
    FORi(9)
    {
        FORj(8)
        printf("%d ",g[i][j]);
        printf("%d\n",g[i][8]);
    }
}
void dfs(int n)
{
    if(n>80)
        show();
    else
    {
        int i=n/9,j=n%9;
        if(!g[i][j])
        {
            for(int k=1; k<=9; k++)
                if(!visx[i][k]&&!visy[j][k]&&!box[i/3*3+j/3][k])
                {
                    g[i][j]=k;
                    visx[i][k]=visy[j][k]=box[i/3*3+j/3][k]=1;
                    dfs(n+1);
                    g[i][j]=0;
                    visx[i][k]=visy[j][k]=box[i/3*3+j/3][k]=0;
                }
        }
        else
            dfs(n+1);
    }
}
int main()
{
    char ch[5];
    bool flag=0;
    while(~scanf("%s",ch))
    {
        CLR(visx,0);
        CLR(visy,0);
        CLR(box,0);
        if(ch[0]>='1'&&ch[0]<='9')
            g[0][0]=ch[0]-'0';
        else if(ch[0]=='?')
            g[0][0]=0;
        if(g[0][0])
            visx[0][g[0][0]]=visy[0][g[0][0]]=box[0][g[0][0]]=1;
        FORi(9)
        FORj(9)
        {
            if(i==0&&j==0)continue;
            scanf("%s",ch);
            if(ch[0]>='1'&&ch[0]<='9')
                g[i][j]=ch[0]-'0';
            else if(ch[0]=='?')
                g[i][j]=0;
            if(g[i][j])
                visx[i][g[i][j]]=visy[j][g[i][j]]=box[i/3*3+j/3][g[i][j]]=1;
        }
        if(!flag)flag=1;
        else printf("\n");
        dfs(0);
    }
}


HDU 1426 Sudoku Killer