题目链接:P4888 三去矩阵 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目:
样例输入输出:
本题主要就是求输入坐标位置所在行列的最大回文串长度,主要思想很直白,从目标位置左右找,再上下找,行和列都找到最大的,他们两再取一个最大值。
代码如下:
#include<iostream>
using namespace std;
char matrix[2001][2001]; // 存矩阵
int main(){
int l,q;
cin>>l>>q;
for (int i = 1; i <= l; ++i) { //读入元素
for(int j = 1;j <= l; ++j){
cin>>matrix[i][j];
}
}
int x,y; //坐标
int length_row,length_column; //水平和竖直方向回文串长度
for (int i = 0; i < q; ++i) { //q次询问
length_row = length_column = 1; //最小的长度就是本身:1
cin>>x>>y;
for (int j = 1; y-j >= 1 && y+j<=l; ++j) { //横向查找,注意两边的边界,左边界y-j>=1,右边界y+i<=l
if (matrix[x][y+j] == matrix[x][y-j]){ //左右相等长度就加2
length_row += 2;
} else{ //否则就不是回文了,没有必要再找下去
break;
}
}
for (int j = 1; x-j >= 1 && x+j <= l; ++j) { //纵向查找
if (matrix[x+j][y] == matrix[x-j][y]){
length_column += 2;
} else{
break;
}
}
cout<<max(length_row,length_column)<<endl;
}
return 0;
}
实测可以通过。