• poj 2676 Sudoku


      数独。。。

      用DFS做。

      刚开始想用一个列表表示某一列,某一行出现了哪些数,后来看到别人用二维数组挺方便的。

      跟普通DFS差不多,不过要判断是否换行,能 深搜 到最后一个点 表示 DFS做完了。

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    using namespace std;
    
    int map[12][12];
    bool row[12][12];
    bool col[12][12];
    bool g[12][12];
    
    bool DFS(int x,int y)
    {
        if(x==10)
            return true;
    
        bool flag=false;
    
        if(map[x][y])
        {
            if(y==9)
                flag=DFS(x+1,1);
            else
                flag=DFS(x,y+1);
    
            if(flag)
                return true;
            else
                return false;
        }
        else
        {
    
            int k=3*((x-1)/3)+(y-1)/3+1;
    
            for(int i=1;i<=9;i++)
                if(!row[x][i] && !col[y][i] && !g[k][i])
                {
                    map[x][y]=i;
    
                    row[x][i]=true;
                    col[y][i]=true;
                    g[k][i]=true;
    
                    if(y==9)
                        flag=DFS(x+1,1);
                    else
                        flag=DFS(x,y+1);
    
                    if(!flag)
                    {
                        map[x][y]=0;
    
                        row[x][i]=false;
                        col[y][i]=false;
                        g[k][i]=false;
                    }
                    else
                        return true;
                }
        }
        return false;
    }
    int main()
    {
        int T;
        char ch;
        scanf("%d",&T);
        while(T--)
        {
            memset(row,false,sizeof(row));
            memset(col,false,sizeof(col));
            memset(g,false,sizeof(g));
            for(int i=1;i<=9;i++)
                for(int j=1;j<=9;j++)
                {
                    cin>>ch;
                    map[i][j]=ch-'0';
                    if(map[i][j])
                    {
                        row[i][map[i][j]]=true;
                        col[j][map[i][j]]=true;
                        int k=3*((i-1)/3)+(j-1)/3+1;
                        g[k][map[i][j]]=true;
                    }
                }
            DFS(1,1);
            for(int i=1;i<=9;i++)
            {
                for(int j=1;j<=9;j++)
                    printf("%d",map[i][j]);
                printf("
    ");
            }
        }
        return 0;
    }
  • 相关阅读:
    C++类中的函数重载
    C++中的友元
    bzoj 2820
    莫比乌斯函数
    bzoj 2440: [中山市选2011]完全平方数
    莫比乌斯反演1
    [转]C++ 指针和引用
    P2756 飞行员配对方案问题
    P2055 [ZJOI2009]假期的宿舍
    P2654 原核生物培养
  • 原文地址:https://www.cnblogs.com/yongren1zu/p/3295529.html
Copyright © 2020-2023  润新知