zoukankan      html  css  js  c++  java
  • 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
    ",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("
    ");
            dfs(0);
        }
    }
    


  • 相关阅读:
    day15---作业
    day14---函数的参数
    day14作业
    day--13函数的基本使用
    day13--函数练习(作业)
    day12--文件处理
    day12--作业
    Python函数对象、函数嵌套和闭包函数
    每日作业以及周末作业
    Python名称空间与作用域
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4094346.html
Copyright © 2011-2022 走看看