poj 4618 暴力

时间:2023-03-09 05:46:47
poj 4618 暴力

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4618

 #include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <queue>
#include <vector>
#define maxn 305
using namespace std; vector<int> G[maxn*maxn];
int a[maxn][maxn];
int maxp;
int N,M; bool find(int u,int v){
int d = G[u].size();
for(int i=;i<d;i++){
if(G[u][i] == v) return true;
}
return false;
}
bool JudgeRowPalindrome(int x1,int y1,int x2,int y2){
if(y1 >= y2) return true;
if(a[x1][y1] == a[x2][y2]){
if(find((x1)*N+y1+,(x2)*N+y2-)) return true;
if(JudgeRowPalindrome(x1,y1+,x2,y2-)){
G[x1*N+y1+].push_back(x2*N+y2-);
return true;
}
}
else return false;
}
bool JudgeColPalindrome(int x1,int y1,int x2,int y2){
if(x1 >= x2) return true;
if(a[x1][y1] == a[x2][y2]){
if(find((x1+)*N+y1,(x2-)*N+y2)) return true; if(JudgeColPalindrome(x1+,y1,x2-,y2)){
G[(x1+)*N+y1].push_back((x2-)*N+y2);
return true;
}
}
else return false; }
bool Judge(int x,int y,int len){
for(int i=x;i<x+len;i++)
if(!find(N*i+y,N*i+y+len-)) return false;
for(int i=y;i<y+len;i++)
if(!find(N*x+i,N*(x+len-)+i)) return false;
return true;
}
int main()
{
// if(freopen("input.txt","r",stdin)== NULL) {printf("Error\n"); exit(0);} int T;
cin>>T;
while(T--){
scanf("%d%d",&N,&M);
for(int i=;i<N;i++)
for(int j=;j<M;j++){
scanf("%d",&a[i][j]);
}
for(int i=;i<=N*M + N+M;i++) G[i].clear(); for(int row=;row<N;row++)
for(int i=;i<M;i++)
for(int j=i+;j<M;j++){
if(find(N*row+i,N*row+j) || a[row][i] != a[row][j]) continue;
bool flag = JudgeRowPalindrome(row,i,row,j);
if(flag) G[N*row+i].push_back(N*row+j);
}
for(int col=;col<M;col++)
for(int i=;i<N;i++)
for(int j=i+;j<N;j++){
if(find(N*i+col,N*j+col) || a[i][col] != a[j][col]) continue;
bool flag = JudgeColPalindrome(i,col,j,col);
if(flag==true) G[N*i+col].push_back(N*j+col);
}
maxp = ;
for(int i=;i<N;i++)
for(int j=;j<M;j++){
if(N-i <= maxp || M-j <= maxp) continue;
if(N--i >= M--j){
for(int k=M-;k>=j+maxp;k--){
if(find(N*i+j,N*i+k)){
int p = k-j+;
if(Judge(i,j,p)){
maxp = p;
}
}
}
}
else{
for(int k=N-;k>=i+maxp;k--){
if(find(N*i+j,N*k+j)){
int p = k-i+;
if(Judge(i,j,p)){
maxp = p;
}
}
}
}
}
printf("%d\n",maxp);
}
}