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;
}
原文地址:https://www.cnblogs.com/DukeLv/p/9664127.html