[BZOJ3109] [cqoi2013]新数独

Description

Input

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

Output

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

Sample Input

< > > < > <
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
< > < > < >

Sample Output

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


无脑爆搜?

发现奇怪的问题。

有一个变量没有初始化(主函数中的x), 然后去掉所有的主函数内的register就A了, 加上就re。

怕是register有一些奇怪的锅??

求dalao告知。


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;

int mp[20][15];
int da[15][15][15][15], xiao[15][15][15][15];

bool vis1[20][20], vis2[20][20], vis3[20][20];
//    hang             lie           kuai
inline int id(int x, int y)
{
    int tx = (x - 1) / 3 + 1, ty = (y - 1) / 3 + 1;
    return (tx - 1) * 3 + ty;
}

inline void print()
{
    for (register int i = 1 ; i <= 9 ; i ++, puts(""))
        for (register int j = 1 ; j <= 9 ; j ++)
            printf("%d ", mp[i][j]);
}

inline bool right(int x, int y, int z)
{
    if (y >= 2 and da[x][y][x][y-1] and z < mp[x][y-1]) return 0;
    if (y >= 2 and xiao[x][y][x][y-1] and z > mp[x][y-1]) return 0;
    if (x >= 2 and da[x][y][x-1][y] and z < mp[x-1][y]) return 0;
    if (x >= 2 and xiao[x][y][x-1][y] and z > mp[x-1][y]) return 0;
    return 1;
}

inline void dfs(int x, int y)
{
    if (x > 9) {
        print();
        exit(0);
    }
    for (register int i = 1 ; i <= 9 ; i ++)
    {
        if (vis1[x][i] or vis2[y][i] or vis3[id(x, y)][i]) continue;
        if (!right(x, y, i)) continue;
        vis1[x][i] = vis2[y][i] = vis3[id(x, y)][i] = 1;
        mp[x][y] = i;
        if (y == 9) dfs(x + 1, 1);
        else dfs(x, y + 1);
        mp[x][y] = 0;
        vis1[x][i] = vis2[y][i] = vis3[id(x, y)][i] = 0;
    }
}

int main()
{
    int x = 0;
    for (register int i = 1 ; i <= 15 ; i ++)
    {
        if (i % 5 == 1 or i % 5 == 3 or i % 5 == 0) {
            x++;
            for (register int j = 1 ; j <= 6 ; j ++)
            {
                char ch;
                cin>>ch;
                while(ch!='>'&&ch!='<') cin>>ch;
                if (ch == '>') {
                    int y = 3 * ((j + 1) / 2 - 1) + (j + 1) % 2 + 1;
                    da[x][y][x][y+1] = 1;
                    xiao[x][y+1][x][y] = 1;    
                } else {
                    int y = 3 * ((j + 1) / 2 - 1) + (j + 1) % 2 + 1;
                    xiao[x][y][x][y+1] = 1;
                    da[x][y+1][x][y] = 1;
                }
            }
        } else {
            x++;
            for (register int j = 1 ; j <= 9 ; j ++)
            {
                char ch;
                cin>>ch;
                while(ch!='^'&&ch!='v') cin>>ch;;
                if (ch == '^') {
                    da[x][j][x-1][j] = 1;
                    xiao[x-1][j][x][j] = 1;
                } else {
                    xiao[x][j][x-1][j] = 1;
                    da[x-1][j][x][j] = 1;                    
                }
            }
            x--;
        }
    }
    dfs(1, 1);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/BriMon/p/9571358.html