蓝桥杯 15届 模拟省赛 心得体会 收获一点点,一起进步。

今天下午打了4个小时的比赛,本人打的是大学c组,在下午的模拟赛中,我有了新的体会。

首先我们要认真的读懂题目的意思,要让自己冷静下来,在清楚的记得在倒数第二题的时候,我没有明白题目的意思,我以为且是并且的意思,所以在打代码的时候就把if条件里面的关系变成了||,导致我改了半天才改回来。改代码真的很让人急躁

#include <bits/stdc++.h>
using namespace std;
int main(){
  int n;cin>>n;
  int a[n+1]={0};
  for(int i=0;i<n;++i){
    cin>>a[i];
  }
  int ans=0;
  int cnt=0;
  int max1=0;
  int min1=100000;
  for(int i=0;i<n;++i){
    if(i==0){
      if(a[i]<a[i+1]){
        ans=a[i];
        if(ans>max1){
          max1=ans;
        }
      }
      if(a[i]>a[i+1]){
        if(cnt<min1){
          min1=cnt;
        }
      }
    }
    if(i==n-1){
      if(a[i]<a[i-1]){
        ans=a[i];
        if(ans>max1){
          max1=ans;
          
        }
      }
      if(a[i]>a[i-1]){
        cnt=a[i];
        if(cnt<min1){
          min1=cnt;
        }
      }
      break;
    }
    if(i>0){
    if(a[i]<a[i-1]||a[i]<a[i+1]){
      ans=a[i];
      if(ans>max1){
        max1=ans;
      }
      if(a[i]>a[i-1]||a[i]>a[i+1]){
        cnt=a[i];
        if(cnt<min1){
          min1=cnt;
          }
        }
      }
    }
  }
  cout<<max1<<" "<<min1;
  return 0;
}

代码中的||换成&&这样就可以通过了,所以说要认真的看题,理解题意

前面的题主要考的暴力,还有一点点思维,在做到编程题最后一题的时候,很明显的是dfs类型

但是我在定义数组的时候,定义的是静态数组,这也导致我在运行的时候会出错,在以前我知道vector这个stl容器

会自己判断数组的长度,也知道vector<int>a[m];这样是在定义二维数组,但是,我还没有明白我想定义n*m的二维数组

该怎么办,所以我在这出现了错误,在后面我经过上网查询以及chatgdp我知道了我的问题所在,我们在定义数组的时候不能确定n和m的值

如果把定义数组放在输入n和m后面,那么写的自定义函数dfs也会报错,所以我们只有定义动态的数组来解决问题

例如vector<vector<int>>a(n,vector<int>(m,0));这样就可以定义二维的动态数组,并且赋值为0

我是现在才知道是这样的。下面给你们看看题目以及最后一道题的解题,也不知道对不对,只是过了样例。还是收获了很多,每天进步一点点,一起准备4月省赛

以前的代码在官方出了模拟赛过后我去试试,发现通过为0,但是还是有值得记录的地方,我就放在最后了,正解已经更新了

#include <bits/stdc++.h>
using namespace std;
const int N=1004;
int n,m;
char a[N][N];
const int dx[3]={-1,-1,1};
const int dy[3]={-1,1,0};
int dfs1(int x,int y,int cnt){
int nx=dx[0]+x;
int ny=dy[0]+y;
if(nx>=0&&nx<n&&a[nx][ny]==a[x][y]&&ny>=0&&ny<m){
  //cnt++;
  return dfs1(nx,ny,cnt+1);
  //dfs1(nx,ny,cnt+1);
}
  return cnt;
}
int dfs2(int x,int y,int cnt){
  int nx=dx[1]+x;
  int ny=dy[1]+y;
  if(nx>=0&&nx<n&&a[nx][ny]==a[x][y]&&ny>=0&&ny<m){
    //cnt++;
    return dfs2(nx,ny,cnt+1);
    //dfs2(nx,ny,cnt+1);
  }
  return cnt;
}
int dfs3(int x,int y,int cnt){
  int nx=dx[2]+x;
  int ny=dy[2]+y;
  if(nx>=0&&nx<n&&a[nx][ny]==a[x][y]&&ny>=0&&ny<m){
    //cnt++;
    return dfs3(nx,ny,cnt+1);
    //dfs3(nx,ny,cnt+1);
  }
  return cnt;
}
int main(){
  cin>>n>>m;
  for(int i=0;i<n;++i){
    for(int j=0;j<m;++j){
      cin>>a[i][j];
    }
  }
  int ans=0;
  for(int i=1;i<n;++i){
    for(int j=1;j<m;++j){
      if(a[i-1][j-1]==a[i][j]&&a[i-1][j+1]==a[i][j]&&a[i+1][j]==a[i][j]){
        int num1=dfs1(i-1,j-1,1);
        int num2=dfs2(i-1,j+1,1);
        int num3=dfs3(i+1,j,1);
        int num4=min(num1,min(num2,num3));
        ans=max(ans,num4);
      }
    }
  }
  cout<<ans;
  return 0;
}
#include <bits/stdc++.h>
using namespace std;
 
const int nx[3] = {-1, 1, 0};
const int ny[3] = {1, 1, -1};
 
void dfs(int x, int y, int &ans, int &num, int &cnt, vector<vector<bool>> &s, vector<vector<char>> &a) {
  s[x][y] = true;
  for (int i = 0; i < 3; ++i) {
    int dx = nx[i] + x;
    int dy = ny[i] + y;
    if (dx >= 0 && dx < s.size() && dy >= 0 && dy < s[0].size() && !s[dx][dy] && a[dx][dy] == a[x][y]) {
      if (i == 0) {
        ans++;
      } else if (i == 1) {
        num++;
      } else if (i == 2) {
        cnt++;
      }
      dfs(dx, dy, ans, num, cnt, s, a);
    }
  }
}
int main() {
  int n, m;
  cin >> n >> m;
  vector<vector<char>> a(n, vector<char>(m));
  vector<vector<bool>> s(n, vector<bool>(m, false));
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      cin >> a[i][j];
    }
  }
  int number = 0;
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      if (!s[i][j]) {
        int ans = 1, num = 1, cnt = 1;
        dfs(i, j, ans, num, cnt, s, a);
        int sum = min(ans, min(num, cnt));
        number = max(number, sum);
      }
    }
  }
  cout << number;
  return 0;
}

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值