Palindrome Sub-Array
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 503 Accepted Submission(s): 256
Problem Description
A palindrome sequence is a sequence which is as same as its reversed order. For example, 1 2 3 2 1 is a palindrome sequence, but 1 2 3 2 2 is not. Given a 2-D array of N rows and M columns, your task is to find a maximum sub-array of P rows and P columns, of which each row and each column is a palindrome sequence.
Input
The first line of input contains only one integer, T, the number of test cases. Following T blocks, each block describe one test case.
There is two integers N, M (1<=N, M<=300) separated by one white space in the first line of each block, representing the size of the 2-D array.
Then N lines follow, each line contains M integers separated by white spaces, representing the elements of the 2-D array. All the elements in the 2-D array will be larger than 0 and no more than 31415926.
There is two integers N, M (1<=N, M<=300) separated by one white space in the first line of each block, representing the size of the 2-D array.
Then N lines follow, each line contains M integers separated by white spaces, representing the elements of the 2-D array. All the elements in the 2-D array will be larger than 0 and no more than 31415926.
Output
For each test case, output P only, the size of the maximum sub-array that you need to find.
Sample Input
1 5 10 1 2 3 3 2 4 5 6 7 8 1 2 3 3 2 4 5 6 7 8 1 2 3 3 2 4 5 6 7 8 1 2 3 3 2 4 5 6 7 8 1 2 3 9 10 4 5 6 7 8
Sample Output
4
Source
Recommend
zhuyuanchen520
题意: 有一个n * m的矩阵, 问最大边长的回文矩阵。
回文矩阵是 每一行都是回文串, 每一列都是回文串。
思路:乱搞
#include <cstdio>
#include <algorithm>
using namespace std;
//回文矩阵特点 水平对称,垂直对称, 离矩阵中心距离相等的值必须相等。
//然后乱搞
const int v = 300 + 5;
int t, n, m, num[v][v], ans;
bool is_ok(int ii, int jj, int len) {
int r_len = len;
for(int i = ii; i < ii + len / 2; ++i) {
int c_len = len;
for(int j = jj; j < jj + len / 2; ++j) {
if(num[i][j] == num[i][j + c_len - 1] && num[i][j] == num[i + r_len - 1][j] && num[i][j] == num[i + r_len - 1][j + c_len - 1])
c_len -= 2;
else
return false;
}
r_len -= 2;
}
return true;
}
int main() {
int i, j;
scanf("%d", &t);
while(t--) {
ans = 1;
scanf("%d%d", &n, &m);
for(i = 0; i < n; ++i)
for(j = 0; j < m; ++j)
scanf("%d", &num[i][j]);
for(i = 0; i < n; ++i)
for(j = 0; j < m; ++j)
for(int k = min(n, m); k > ans; --k) {
if(i + k > n || j + k > m)
continue;
if(is_ok(i, j, k)) {
ans = max(ans, k);
break;
}
}
printf("%d\n", ans);
}
}