这道题思路比较简单,但实现起来比较复杂。首先生成一个排好序的二维数组,然后将要判断的数组一圈的数字存到一个数组中,和已经排序好的数组比较。 程序代码: #include <iostream> #include <cstdio> using namespace std; const int MAXN = 1010; int Grids[MAXN][MAXN], Digit[MAXN][MAXN], tGrids[MAXN * 4], tDigit[MAXN * 4]; int Calculate(int p, int n) { int r, c; int cnt = 0; r = p; for(c = r; c <= (n - p); c++){ tGrids[cnt] = Grids[r][c]; tDigit[cnt++] = Digit[r][c]; } for(; r <= (n - p); r++){ tGrids[cnt] = Grids[r][c]; tDigit[cnt++] = Digit[r][c]; } for(; c > p; c--){ tGrids[cnt] = Grids[r][c]; tDigit[cnt++] = Digit[r][c]; } for(; r > p; r--){ tGrids[cnt] = Grids[r][c]; tDigit[cnt++] = Digit[r][c]; } for(p = 0; p < cnt; p++) if(tGrids[p] == tDigit[0]) break; if(tGrids[p] != tDigit[0]) return 0; for(int i = (p + 1) % cnt, j = 1; j < cnt; i = (i + 1) % cnt, j++){ if(tGrids[i] != tDigit[j]) return 0; } return 1; } int main() { int n, len; int flag, con = 1; //freopen("input.txt", "r", stdin); while(scanf("%d", &n) == 1){ if(!n) break; for(int i = 1, k = 1; i <= n; i++) for(int j = 1; j <= n; j++){ scanf("%d", &Grids[i][j]); Digit[i][j] = k++; } len = n & 1 ? (n + 1) / 2 : n / 2; flag = 0; for(int i = 1; i <= len; i++){ if(i == len && (n & 1)){ if(Grids[i][i] != Digit[i][i]) flag = 1; break; } if(!Calculate(i, n)){ flag = 1; break; } } printf("%d. ", con++); if(flag) printf("NO/n"); else printf("YES/n"); } return 0; }