测试样例:
7 7
1000001
0100010
0010100
0001AAA
00010A0
00010A0
00010A0输出应该是
3
我的代码:
#include <iostream> using namespace std; char s[1001][1001]; int main() { // 请在此输入您的代码 int n,m; cin>>n>>m; int max=0; int len; for(int i=0;i<n;i++) { cin>>s[i]; } for(int i=1;i<n-1;i++) //能出现Y的中心的点只会从(1,1)到(n-1,m-1) { for(int j=1;j<m-1;j++) { len=1; //先假设长度为1,其实是为了更好的循环,好让三个方向去寻找 while((i-len)>=0&&(j-len)>=0&&(j+len)<m &&(i+len)<n) { if(s[i][j]==s[i-len][j-len]&&s[i][j]==s[i-len][j+len]&&s[i][j]==s[i+len][j]) { //不能写成4个坐标相等,因为数组值可能出现0或1,这就容易逻辑判断错误了 len++; }else break; } if(len-1>max) max=len-1; //因为我们先假设长度为1,所以最后要减去1 } } cout<<max; return 0; }
第二种:用vector容器写的,道理跟上段代码一样
#include <iostream> #include <vector> using namespace std; int main() { int max_len = 0, len; int n, m; cin >> n >> m; vector<vector<char>>map(n, vector<char>(m)); for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) cin >> map[i][j]; for (int i = 1; i < n-1; i++) { int len = 1; for (int j = 1; j < m-1; j++) { while (((i + len) <n && (j + len) < m) && ((i - len) >= 0 && (j - len) >=0) && (map[i][j] == map[i - len][j - len]) && (map[i][j] == map[i - len][j + len]) && (map[i][j] == map[i + len][j]) ) { len++; } if (len-1> max_len) { max_len = len-1; } } } cout << max_len; return 0; }
需要注意的是while那里的判断条件,必须先判断坐标有没有越界,然后再去判断是否相等。
如果先判断相等,再判断越界,就会出现报错(因为判断相等涉及坐标,而坐标还没有判断是否越界就去使用了)
参考他人的代码:
NO.1
#include<stdio.h>
char a[1001][1002];
int main()
{
int n,m,i,j,max=0,x;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
scanf("%s",a[i]);
for(i=1;i<n-1-max;i++) //两个for循环中的"-max"是为了减小时间的消耗
{
for(j=1;j<m-1-max;j++)
{
x=1;
while(((i-x)>=0 &&(j-x)>=0 && (i+x)<n &&(j+x)<m) && (a[i][j]==a[i-x][j-x] && a[i][j]==a[i-x][j+x] && a[i][j]==a[i+x][j]))
x++;
if(x-1>max)
max=x-1;
}
}
printf("%d",max);
return 0;
}
NO.2
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e3 + 9;
char a[N][N];
int main(){
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i]+1;
int ans = 0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int len = 1;
while(i-len>=1&&j-len>=1&&j+len<=m&&i+len<=n){
if(a[i-len][j-len]==a[i][j]&&a[i-len][j+len]==a[i][j]&&a[i+len][j]==a[i][j]){
len++;
}else break;
ans = max(ans,len);
}
}
}
if(ans == 0)cout<<0;
else cout<<ans-1;
return 0;
}
No.3