HDU 2859

题意略。

思路:

因为这个对称的矩阵是按次对角线来定义对称的,那我们只需要考虑从左下到右上的这(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;
}
原文地址:https://www.cnblogs.com/tiberius/p/11300465.html