[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
< > < > < >
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; }