• B3109 [cqoi2013]新数独 搜索dfs


    就是基于普通数独上的一点变形,然后就没什么了,普通数独就是进行一边dfs就行了。

    题干:

    题目描述


    输入格式

    输入一共15行,包含一个新数独的实例。第奇数行包含左右方向的符号(<和>),第偶数行包含上下方向的符号(^和v)。
     

    输出格式

    输出包含9行,每行9个1~9的数字,以单个空格隔开。输入保证解惟一。

    样例输入

     < >   > <   > < 
    v v ^ ^ v v ^ ^ ^
     < <   > <   > < 
    ^ ^ ^ v ^ ^ ^ v v
     < <   < <   > > 
     > <   > >   > > 
    v ^ ^ ^ ^ v v v ^
     > >   > >   < > 
    v v ^ v ^ v ^ v ^
     > <   < >   > > 
     < <   < <   > < 
    v ^ v v v v ^ ^ v
     < >   > <   < > 
    ^ v v v ^ v ^ v v
     < >   < >   < > 
    

    样例输出

    4 9 1 7 3 6 5 2 8
    2 3 7 8 1 5 6 4 9
    5 6 8 2 4 9 7 3 1
    9 1 3 6 5 4 8 7 2
    8 5 4 9 7 2 1 6 3
    7 2 6 3 8 1 9 5 4
    3 4 9 5 6 8 2 1 7
    1 8 5 4 2 7 3 9 6
    6 7 2 1 9 3 4 8 5
    代码:
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<ctime>
    #include<queue>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    #define duke(i,a,n) for(int i = a;i <= n;i++)
    #define lv(i,a,n) for(int i = a;i >= n;i--)
    #define clean(a) memset(a,0,sizeof(a))
    const int INF = 1 << 30;
    typedef long long ll;
    typedef double db;
    template <class T>
    void read(T &x)
    {
        char c;
        bool op = 0;
        while(c = getchar(), c < '0' || c > '9')
            if(c == '-') op = 1;
        x = c - '0';
        while(c = getchar(), c >= '0' && c <= '9')
            x = x * 10 + c - '0';
        if(op) x = -x;
    }
    template <class T>
    void write(T x)
    {
        if(x < 0) putchar('-'), x = -x;
        if(x >= 10) write(x / 10);
        putchar('0' + x % 10);
    }
    int n;
    char o;
    bool gx[10][10][10][10],h[10][10],l[10][10],g[10][10];
    int a[10][10];
    void dfs(int x,int y)
    {
        if(a[x][y])
        {
            if(x == 9 && y == 9)
            {
                duke(i,1,9)
                {
                    duke(j,1,9)
                    {
                        cout<<a[i][j]<<" ";
                    }
                    cout<<endl;
                }
            }
            else if(y == 9)
            {
                dfs(x + 1,1);
            }
            else
            {
                dfs(x,y + 1);
            }
        } 
        else
        {
            duke(i,1,9)
            {
                if(!h[x][i] && !l[y][i] && !g[(x - 1) / 3 * 3 + (y - 1) / 3 + 1][i] && (((a[x - 1][y] > i) == gx[x - 1][y][x][y]) || (x % 3 == 1)) && ((y % 3 == 1) || ((a[x][y - 1] > i) == gx[x][y - 1][x][y])))
                {
                    a[x][y] = i;
                    h[x][i] = true,
                    l[y][i] = true,
                    g[(x - 1) / 3 * 3 + (y - 1) / 3 + 1][i] = true;
                    dfs(x,y);
                    a[x][y] = 0;
                    h[x][i] = false,
                    l[y][i] = false,
                    g[(x - 1) / 3 * 3 + (y - 1) / 3 + 1][i] = false;
                }
            }
        }
    
    }
    int main()
    {
        duke(i,1,3)
        {
            duke(j,1,5)
            {
                if(j % 2 == 0)
                {
                    duke(k,1,9)
                    {
                        cin>>o;
                        if(o == 'v')
                        gx[(i - 1) * 3 + j / 2][k][(i - 1) * 3 + j / 2 + 1][k] = true;
                    }
                }
                else
                {
                    duke(k,1,6)
                    {
                        cin>>o;
                        if(o == '>')
                        gx[(i - 1) * 3 + (j - 1) / 2 + 1][(k - 1) / 2 * 3 + (k - 1) % 2 + 1][(i - 1) * 3 + (j - 1) / 2 + 1][(k - 1) / 2 * 3 + (k - 1) % 2 + 2] = true;
                    }
                }
            }
        }
        dfs(1,1);
        return 0;
    }
  • 相关阅读:
    团队作业——系统设计
    团队作业—预则立&&他山之石
    Alpha 冲刺报告2
    Android:Date、String、Long三种日期类型之间的相互转换
    冲刺阶段第一天
    需求分析答辩总结
    用ExifInterface读取经纬度的时候遇到的一个问题
    项目uml设计
    项目选题报告答辩总结
    深夜睡不着,去某乎爬点照片
  • 原文地址:https://www.cnblogs.com/DukeLv/p/9664127.html
Copyright © 2020-2023  润新知