最大的Y(省模拟赛-16567)

 

测试样例:

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

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值