• poj 2676 Sudoku


    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    int mp[10][10],row[10][10],col[10][10],grid[10][10];
    
    int get(int x,int y)
    {
        if(x>=1&&x<=3)
        {
            if(y>=1&&y<=3) return 1;
            else if(y>=4&&y<=6) return 4;
            else return 7;
        }
        else if(4<=x&&x<=6)
        {
            if(y>=1&&y<=3) return 2;
            else if(y>=4&&y<=6) return 5;
            else return 8;
        }
        else
        {
            if(y>=1&&y<=3) return 3;
            else if(y>=4&&y<=6) return 6;
            else return 9;
        }
    }
    
    int dfs(int x,int y)
    {
        if(x==10) return 1;
        int flag=0,i;
        if(mp[x][y])
        {
            if(y==9)
                flag=dfs(x+1,1);
            else
                flag=dfs(x,y+1);
    
            if(flag) return 1;
            else return 0;
        }
        else
        {
            for(i=1; i<=9; i++)
            {
                int k=get(x,y);
                if(!row[x][i]&&!col[y][i]&&!grid[k][i])
                {
                    row[x][i]=1;
                    col[y][i]=1;
                    grid[k][i]=1;
                    mp[x][y]=i;
                    if(y==9)
                        flag=dfs(x+1,1);
                    else
                        flag=dfs(x,y+1);
    
                    if(flag==0)
                    {
                        row[x][i]=0;
                        col[y][i]=0;
                        grid[k][i]=0;
                        mp[x][y]=0;
                    }
                    else
                        return 1;
                }
            }
        }
        return 0;
    }
    
    int main()
    {
        int i,j,k,_;
        char s;
        scanf("%d",&_);
        while(_--)
        {
            memset(row,0,sizeof(row));
            memset(col,0,sizeof(col));
            memset(grid,0,sizeof(grid));
    
            for(i=1; i<=9; i++)
                for(j=1; j<=9; j++)
                {
                    cin>>s;
                    mp[i][j]=s-'0';
                    if(mp[i][j])
                    {
                        k=get(i,j);
                        row[i][mp[i][j]]=1;
                        col[j][mp[i][j]]=1;
                        grid[k][mp[i][j]]=1;
                    }
                }
            dfs(1,1);
    
            for(i=1; i<=9; i++)
            {
                for(j=1; j<=9; j++)
                {
                    printf("%d",mp[i][j]);
                }
                printf("
    ");
            }
        }
        return 0;
    }
    

    版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/

  • 相关阅读:
    枚举类型(C#)
    如何在Delphi中安装组件
    操作系统知识点总结
    Java内部类学习笔记
    计算机网络笔试面试常考考点
    电话号码分身问题
    最长下降/上升子序列问题
    LeetCode(162):Find Peak Element
    LeetCode(153):Find Minimum in Rotated Sorted Array
    LeetCode(75):Sort Colors
  • 原文地址:https://www.cnblogs.com/xryz/p/4847928.html
Copyright © 2020-2023  润新知