题意略。
思路:
因为这个对称的矩阵是按次对角线来定义对称的,那我们只需要考虑从左下到右上的这(2 * n - 1)条对角线即可。
在考虑待检验的矩阵由k转移到k + 1这个大小时,我们只要考虑新增的一列和新增的一行是否对称即可,如果对称,则k+1这个大小的矩阵也是对称矩阵。
在这个过程中,采用尺取法,至于检查对称,我们暴力检查即可。
代码附上:
#include<bits/stdc++.h> using namespace std; const int maxn = 1005; char matrix[maxn][maxn]; int n; int nextpos(int up,int down){ int x0 = up / n,y0 = up % n; int x1 = down / n,y1 = down % n; int len = (down - up) / (n - 1) + 1; int i; for(i = 0;i < len && matrix[x1 - i][y1] == matrix[x1][y1 + i];++i); return i == len ? -1 : down - (n - 1) * (i - 1); } int main(){ while(scanf("%d",&n) == 1 && n){ for(int i = 0;i < n;++i) scanf("%s",matrix[i]); int total = (n - 1)<<1,maxx = n * n - 1; int ans = 1; for(int t = 1;t < total;++t){ for(int idx = t < n ? t : (t - n + 1) * n + (n - 1),tail = idx;idx <= maxx && tail <= maxx;tail += (n - 1)){ int temp = nextpos(idx,tail); if(temp == -1) ans = max(ans,(tail - idx) / (n - 1) + 1); else idx = temp; if(idx % n == 0 || tail % n == 0) break; } } printf("%d ",ans); } return 0; }