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; }
只想找一个不会伤害我的人