语法周赛 weekend2 题解

A+B=B

难度:需要掌握分支以及字符和数字之间的转换。

30 分做法:由于数据中 30% 的数据能保证 x 为 A,所以直接输出 y 即可。

满分做法:由于数据比较小,只有 A∼J,所以计算结果会在 0∼18,转换为字符是 A∼BI。将两个字符转换为数字相加,再判断结果是否小于 10,小于 10 就将结果直接换为字符;否则将十位数和个位数分别算出来,输出两个字符。

#include<bits/stdc++.h>
using namespace std;
int main(){
  char x,y;
  cin>>x>>y;
  int a=x-'A';
  int b=y-'A';
  int z=a+b;
  if(z<10) cout<<char(z+'A');
  else{
    int g=z%10;//个位
    int s=z/10;//十位
    cout<<char(s+'A')<<char(g+'A');
  }
  return 0;
}

ABBA

难度:直接使用循环解决。

满分做法:a 的 b 次方,用循环计算 b 次乘以 a 的结果;b的 a 次方,用循环计算 a 次乘以 b 的结果,变量记得开 long long(最后计算出来的数据量会超出 int 范围)。计算出结果后直接判断即可(用到了 else if,或者只用 if 语句也可以)。

#include<bits/stdc++.h>
using namespace std;

int main(){
  int a,b;
  cin>>a>>b;
  long long c=1,d=1;
  for(int i=1;i<=b;i++)
  {
    c=c*a;
  }
  for(int i=1;i<=a;i++)
  {
    d=d*b;
  }
  if(c>d) cout<<"first";
  else if(c<d) cout<<"second";
  else cout<<"same";
}

环状字符串

难度:能正确使用字符串即可。

30 分做法:数据的开始和结束在 0∼len−1 之间,直接输出字符串中的第 n−1 个字符到 n+m−2 个字符。字符串下标是从 0 开始的。

满分做法:循环从第 n−1 个字符到 n+m−2 个字符,如果 i 大于字符串长度,以字符串环状的规律来看,要输出的是 i%len 的字符。

#include <bits/stdc++.h>
using namespace std;
int main(){
  string s;
  cin>>s;
  int len=s.length();
  int n,m;
  cin>>n>>m;
  n=n-1;
  for(int i=n;i<=n+m-1;i++)
  {
    cout<<s[i%len];
  }
}

照明


难度:需要熟练掌握二维数组以及嵌套循环的使用。
满分做法:首先在二维数组中找出灯所在的位置,并在此位置进行操作,将上下左右都照亮并标记,但是根据题目要求,一旦碰到墙就停止,所以四个方向上都要进行判断,碰到墙或者到达二维数组的边缘就停下来。最后在二维数组中判断有多少点被标记了。


#include <bits/stdc++.h>
using namespace std;
char Map[31][31];
int n,cnt=0,x[901],y[901],cur=0;
bool vis[31][31]={};
int main()
{
  cin>>n;
  for(int i=1;i<=n;i++)
  {
    for(int j=1;j<=n;j++)
    {
      cin>>Map[i][j];
      if(Map[i][j]=='*')
      {
        x[++cur]=i;
        y[cur]=j;
      }
    }
  }
  for(int i=1;i<=cur;i++)
  {
    int h=x[i],z=y[i];
    for(int j=h;j>=1;j--)
    {
      if(Map[j][z]=='#')
      {
        break;
      }
      else
      {
        vis[j][z]=1;
      }
    }
    for(int j=h;j<=n;j++)
    {
      if(Map[j][z]=='#')
      {
        break;
      }
      else
      {
        vis[j][z]=1;
      }
    }
    for(int j=z;j>=1;j--)
    {
      if(Map[h][j]=='#')
      {
        break;
      }
      else
      {
        vis[h][j]=1;
      }
    }
    for(int j=z;j<=n;j++)
    {
      if(Map[h][j]=='#')
      {
        break;
      }
      else
      {
        vis[h][j]=1;
      }
    }
  }
  for(int i=1;i<=n;i++)
  {
    for(int j=1;j<=n;j++)
    {
      if(vis[i][j]==true)
      {
        cnt++;
      }
    }
  }
  cout<<cnt;
  return 0;
}

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注