1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
| #include <iostream> #include <cstring> #include <cstdio>
using namespace std; const int N = 10;
int dx1[] = {0, 2,2,1,3,3}; int dx2[] = {0, 1,4,2,2,3}; int dy1[] = {0, 2,2,3,2,1}; int dy2[] = {0, 3,3,1,2,4};
bool stx[N][N]; bool sty[N][N]; int g[N][N]; int n = 5;
bool check() { for(int i = 1;i <= n;i ++) { int max1 = 0, ans = 0; for(int j = 1;j <= n;j ++) { if(g[i][j] > max1) { max1 = g[i][j]; ans ++; } } if(ans != dy1[i]) return false; max1 = 0, ans = 0; for(int j = n;j >= 1;j --) { if(g[i][j] > max1) { max1 = g[i][j]; ans ++; } } if(ans != dy2[i]) return false; } for(int j = 1;j <= n;j ++) { int max1 = 0, ans = 0; for(int i = 1;i <= n;i ++) { if(g[i][j] > max1) { max1 = g[i][j]; ans ++; } } if(ans != dx1[j]) return false; max1 = 0, ans = 0; for(int i = n;i >= 1;i --) { if(g[i][j] > max1) { max1 = g[i][j]; ans ++; } } if(ans != dx2[j]) return false; } return true; }
void dfs(int x, int y) { for(int i = 1;i <= n;i ++) { if(stx[y][i]) continue; if(sty[x][i]) continue; stx[y][i] = true; sty[x][i] = true; g[x][y] = i; if (y == n && x < n) { dfs(x + 1, 1); } else if (y < n && x <= n)dfs(x, y + 1); else if (x == n) { if (check()) { for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) printf("%d", g[i][j]); } } g[x][y] = 0; stx[y][i] = false; sty[x][i] = false; } }
int main() { dfs(1, 1); return 0; }
|