zoukankan      html  css  js  c++  java
  • Sudoku---hdu2676(数独DFS)

    http://poj.org/problem?id=2676

    递归深搜 

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<stdlib.h>
    #include<math.h>
    #include<iostream>
    
    using namespace std;
    
    #define N 100
    #define INF 0xffffffff
    #define memset(a,b) memset(a,b,sizeof(a))
    
    int a[15][15];
    
    struct node
    {
        int x,y;
    } e[N];
    int sum;
    
    int v1[N][N],v2[N][N],v3[N][N], ok;
    
    void DFS(int p)
    {
    
        if(p>sum)
        {
            ok=1;
            return;
        }
    
        for(int i=1; i<=9; i++)
        {
            if(!ok)
                if(v1[e[p].x][i]==0 && v2[e[p].y][i]==0 && v3[(e[p].x/3)*3+e[p].y/3][i]==0)
                {
                    a[e[p].x][e[p].y]=i;
                    v1[e[p].x][i]=1;
                    v2[e[p].y][i]=1;
                    v3[(e[p].x/3)*3+e[p].y/3][i]=1;
    
                    DFS(p+1);
    
                    //  a[e[p].x][e[p].y]=0;
                    v1[e[p].x][i]=0;
                    v2[e[p].y][i]=0;
                    v3[(e[p].x/3)*3+e[p].y/3][i]=0;
                }
        }
    }
    
    int main()
    {
        int T;
        scanf("%d ",&T);
        while(T--)
        {
            memset(v1,0);
            memset(v2,0);
            memset(v3,0);
            ok=sum=0;
            char str[N];
            for(int i=0; i<9; i++)
            {
                scanf("%s",str);
                for(int j=0; j<9; j++)
                {
                    a[i][j]=str[j]-'0';
                    if(a[i][j]!=0)
                    {
                        v1[i][a[i][j]]=1;
                        v2[j][a[i][j]]=1;
                        v3[(i/3)*3+j/3][a[i][j]]=1;
                    }
                    else
                    {
                        sum++;
                        e[sum].x=i;
                        e[sum].y=j;
                    }
                }
            }
            DFS(1);
            for(int i=0; i<9; i++)
            {
                for(int j=0; j<9; j++)
                {
                    printf("%d",a[i][j]);
                }
                printf("
    ");
            }
    
        }
        return 0;
    }
  • 相关阅读:
    29
    28
    27
    950. 按递增顺序显示卡牌
    25
    20190624
    409. 最长回文串
    636. 函数的独占时间
    LeetCode 1046. 最后一块石头的重量(1046. Last Stone Weight) 50
    LeetCode 942. 增减字符串匹配(DI String Match) 49
  • 原文地址:https://www.cnblogs.com/linliu/p/5377879.html
Copyright © 2011-2022 走看看