题目大意:B[i, j]表示周围有多少个比它大的数,能否用B数组构造出一个A数组,如果不能输出“NO SOLUTION”。
分析:数据规模比较小,可以直接暴力枚举每个点的值。
代码如下:
#include<stdio.h> #include<algorithm> #include<string.h> #include<math.h> using namespace std; const int MAXN = 10; int dir[4][10][5] = {{},{},{{},{2,3},{1,4},{1,4},{2,3}}, {{},{2,4},{1,3,5},{2,6},{1,5,7},{2,4,6,8},{3,5,9},{4,8},{5,7,9},{6,8}}}; int near[4][10][5] = {{},{},{{},{},{1},{1},{2,3}},{{},{},{1},{2},{1},{2,4},{3,5},{4},{5,7},{6,8}}}; int B[MAXN], A[MAXN], ok, N; bool nBigger(int k) { int i, cnt = 0, zero=0; for(i=0; dir[N][k][i]; i++) { if(A[k] < A[dir[N][k][i]]) cnt++; if(!A[dir[N][k][i]]) zero++; } if(cnt > B[k]) return false; if(cnt+zero < B[k]) return false; return true; } void DFS(int k) { int i, j; if(k == N*N+1) ok = 1; if(ok)return ; for(i=1; i<MAXN; i++) { A[k] = i; if(nBigger(k) == false) continue; for(j=0; near[N][k][j]; j++) { if(!nBigger(near[N][k][j])) break; } if(near[N][k][j] == 0) DFS(k+1); if(ok)return ; } A[k] = 0; } int main() { scanf("%d", &N); for(int i=1; i<=N; i++) for(int j=1; j<=N; j++) scanf("%d", &B[(i-1)*N+j]); DFS(1); if(!ok) printf("NO SOLUTION\n"); else { for(int i=1; i<=N; i++) for(int j=1; j<=N; j++) printf("%d%c", A[(i-1)*N+j], j==N?'\n':' '); } return 0; }