zoukankan      html  css  js  c++  java
  • Sudoku Killer--hdu1426(数独 跟上一题差不多 但是输入时问题)

    http://acm.hdu.edu.cn/showproblem.php?pid=1426

    注意输入问题就行

    还是dfs

    #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[N][N],v1[N][N],v2[N][N],v3[N][N];
    int ok=0,sum;
    
    struct node
    {
        int x,y;
    } e[N];
    
    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+1][i]==0)
                {
                    v1[e[p].x][i]=1;
                    v2[e[p].y][i]=1;
                    v3[e[p].x/3*3+e[p].y/3+1][i]=1;
                    a[e[p].x][e[p].y]=i;
    
                    DFS(p+1);
    
                    v1[e[p].x][i]=0;
                    v2[e[p].y][i]=0;
                    v3[e[p].x/3*3+e[p].y/3+1][i]=0;
                }
        }
    
    }
    
    int main()
    {
        char str[50];
        int k=0,flag=0,b=0;
        sum=0;
        memset(a,0);
        memset(v1,0);
        memset(v2,0);
        memset(v3,0);
        while(scanf("%s",str)!=EOF)
        {
            if(str[0]=='?')
            {
                a[k][b]=0;
                sum++;
                e[sum].x=0;
                e[sum].y=0;
                b++;
            }
            else
            {
                a[0][0]=str[0]-'0';
                v1[0][a[0][0]]=1;
                v2[0][a[0][0]]=1;
                v3[1][a[0][0]]=1;
            }
            for(int i=0; i<9; i++)
            {
                for(int j=0; j<9; j++)
                {
                    if(i==0 && j==0)
                        continue;
                    scanf("%s",str);
                    if(str[0]=='?')
                    {
                        a[i][j]=0;
                        sum++;
                        e[sum].x=i;
                        e[sum].y=j;
                        b++;
                    }
                    else
                    {
                        a[i][j]=str[0]-'0';
                        v1[i][a[i][j]]=1;
                        v2[j][a[i][j]]=1;
                        v3[i/3*3+j/3+1][a[i][j]]=1;
                    }
                }
            }
            DFS(1);
            if(flag==1)
                printf("
    ");
            for(int i=0; i<9; i++)
            {
                for(int j=0; j<9; j++)
                {
                    if(j==0)
                        printf("%d",a[i][j]);
                    else
                        printf(" %d",a[i][j]);
                }
                printf("
    ");
            }
    
            flag=1;
            k=0;
            sum=0;
            ok=0;
            b=0;
            memset(a,0);
            memset(v1,0);
            memset(v2,0);
            memset(v3,0);
    
        }
        return 0;
    }
  • 相关阅读:
    【 socke】C# socket端口复用-多主机头绑定
    【网络】 NAT
    【socket】高级用法-ReceiveMessageFrom
    【socket】高级用法-异步
    C# GET 和 SET作用
    多态是什么意思?
    LINQ(LINQ to Entities)
    LINQ(隐式表达式、lambda 表达式)
    LINQ(LINQ to DataSet)
    C# 中的委托和事件
  • 原文地址:https://www.cnblogs.com/linliu/p/5378048.html
Copyright © 2011-2022 走看看