• HDU 1426 Sudoku Killer


    很暴力的用深搜.要说有优化的话,只有记录缺数的坐标,从横行缺数最少的一行开始搜.

    杭电正举行成都网络赛,可惜学校没报名参加,队友也没有..唉.想起就伤心,只能自己刷题玩了.

    #include <iostream>
    using namespace std;
    char map[9][9];
    int n;
    struct Node
    {
        int x,y;
    };
    Node L[81];
    bool islegal(int x,int y,char num)
    {
        int i;
    
        for( i=x/3*3;i<x/3*3+3;i++)   //判断九宫是否重复
        {
            for(int j=y/3*3;j<y/3*3+3;j++)
            {
                if(map[i][j] == num)
                  return false;
    
            }
        }
        for( i=0;i<9;i++)              //判断横竖是否重复
        {
            if(map[x][i] == num || map[i][y] == num)
              return false;
        }
        return true;
    }
    bool suc ;
    void dfs(int t)
    {
        int i,j;
        if(suc) return;
        if(t == n)
        {
            for(i=0;i<9;i++)
            {
                printf("%c",map[i][0]);
                for(j=1;j<9;j++)
                {
                    printf(" %c",map[i][j]);
                }
                printf("
    ");
                suc = true;
    
            }
            return;
        }
    
        for(j=1;j<=9;j++)
        {
            if(islegal(L[t].x,L[t].y,j + '0'))  //若无重复
            {
                map[L[t].x][L[t].y] = j + '0';  //标记
                dfs( t + 1);
                if(suc) return;
                map[L[t].x][L[t].y] = '?';      //恢复
    
            }
        }
    }
    int main(int argc, const char *argv[])
    {        
    //    freopen("input.txt","r",stdin);
        int s = 0;
        char ch[2];
        while(~scanf("%s",ch))                 //输入处理可用字符串
        {
            n = 0;
            int i,j,k;
            map[0][0] = ch[0];
            memset(L,0,sizeof(L));
            for(i=0;i<9;i++)
            {
                bool vis[9];
                memset(vis,0,sizeof(vis));
                for(j=0;j<9;j++)
                {
                    if((i+j)!=0) {
                        scanf("%s",ch);
                        map[i][j] = ch[0];
                    }
                    if(map[i][j] != '?')
                    {
                        char c = ch[0];
                        vis[c - '0' - 1] = 1;
                    }else
                    {
                        L[n].x = i;
                        L[n].y = j;
                        n++;
                    }
                }
            }
            suc = false;
            if(s)
                cout<<endl;
            s++;
            dfs(0);
    
        }
        return 0;
    
    }
  • 相关阅读:
    Directx11教程(63) tessellation学习(5)
    OpenCL 学习step by step (1) 安装AMD OpenCL APP
    Directx11教程(62) tessellation学习(4)
    Directx11教程(61) tessellation学习(3)
    Notes 和 Domino 已知限制
    asp.net中的WebApplication和WebSite
    平淡的2007
    TinyMCE与Domino集成
    jOOQ 2.6.0 发布,Java的ORM框架
    bandwidth 0.32f 发布,内存带宽测试工具
  • 原文地址:https://www.cnblogs.com/destino74/p/3321136.html
Copyright © 2020-2023  润新知