01 扫雷
题目描述
在一个n行列的方格图上有一些位置有地雷,另外一些位置为空。
请为每个空位置标一个整数,表示周围八个相邻的方格中有多少个地雷。
输入描述
输入的第一行包含两个整数n,m。
第2行到第n+1行每行包含m个整数,相邻整数之间用一个空格分隔。如果对应的整数为0,表示这一格没有地雷。如果对应的整数为1,表示这一格有地雷。
其中,1≤n,m≤100分钟后还是在当天。
输出描述
输出n行,每行m个整数,相邻整数之间用空格分隔。
对于没有地雷的方格,输出这格周围的地雷数量。对于有地雷的方格,输出9。
输入输出样例
示例1
输入
3 4
0 1 0 0
1 0 1 0
0 0 1 0
输出
2 9 2 1
9 4 9 2
1 3 9 2
#include <iostream>
using namespace std;
int main()
{int n,m;cin>>n>>m;int a[n][m];int c[n][m];for(int i=0;i<n;i++){for(int j=0;j<m;j++){c[i][j]=0;cin>>a[i][j];}}for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(a[i][j]==1){c[i][j]=9;for(int b=i-1;b<=i+1;b++){for(int d=j-1;d<=j+1;d++){if(a[b][d]==0&&b>=0&&d>=0){c[b][d]++;}}}}}
} for(int i=0;i<n;i++){for(int j=0;j<m;j++){cout<<c[i][j]<<" ";}cout<<"\n";}return 0;
}
02 单词分析
题目描述
小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这个字母出现的次数。
输入描述
输入一行包含一个单词,单词只由小写英文字母组成。
对于所有的评测用例,输入的单词长度不超过1000。
输出描述
输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪个。如果有多个字母出现的次数相等,输出字典序最小的那个。
第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数。
输入输出样例
示例1
输入
Lanqiao
输出
a
2
示例2
输入
longlonglongistoolong
输出
o
6
解题思路
简单模拟题。
开一个数组存储每个字母出现的次数,然后根据题意简单判断一下即可。
或者先求出最大出现次数,再求出出现频率=最大出现次数的最小字符。
#include<bits/stdc++.h>
using namespace std;
int ch , ma , cnt[30];
signed main()
{string s;cin >> s;for(auto i : s) cnt[i - 'a'] ++ ;for(int j = 0 ; j < 26 ; j ++) if(ma < cnt[j]) ma = cnt[j] , ch = j;cout << (char)(ch + 'a') << '\n';cout << ma << '\n';return 0;
}
法二
#include <stdio.h>
#include <string.h>
//先遍历所有字母,记录字母的格式,然后进行最大值判断。
int main()
{char a[1000];int b[26]={0};int lenth;scanf("%s",a);lenth=strlen(a);int i=0;int max = 0;int j=0;int max_index =0; for (i=0;i<lenth;i++){switch(a[i]){case 'a': b[0] += 1; break;case 'b': b[1] += 1; break;case 'c': b[2] += 1; break;case 'd': b[3] += 1; break;case 'e': b[4] += 1; break;case 'f': b[5] += 1; break;case 'g': b[6] += 1; break;case 'h': b[7] += 1; break;case 'i': b[8] += 1; break;case 'j': b[9] += 1; break;case 'k': b[10] += 1; break;case 'l': b[11] += 1; break;case 'm': b[12] += 1; break;case 'n': b[13] += 1; break;case 'o': b[14] += 1; break;case 'p': b[15] += 1; break;case 'q': b[16] += 1; break;case 'r': b[17] += 1; break;case 's': b[18] += 1; break;case 't': b[19] += 1; break;case 'u': b[20] += 1; break;case 'v': b[21] += 1; break;case 'w': b[22] += 1; break;case 'x': b[23] += 1; break;case 'y': b[24] += 1; break;case 'z': b[25] += 1; break;}}for (j=0;j<26;j++){if(b[j] > max){max = b[j];max_index = j;}else if (b[j] == max ){if(j<max_index){max_index = j;max = b[j];} else {max = max;max_index = max_index;}}} //for(i=0;i<26;i++){// printf("%d\n",b[i]);//}//printf("%s\n%d%d",a,max,max_index);printf("%c\n%d\n",'a'+max_index,max);return 0;
}
03 超级质数
问题描述
如果一个质数P的每位数字都是质数,而且每两个相邻的数字组成的两位数是质数,而且每三位相邻的数字组成的三位数是质数,依次类推,如果每相邻的K:位数字组成的k:位数都是质数,则P称为超级质数。如果把超级质数P看成一个字符串,则这个超级质数的每个子串都是质数。
例如,53是一个超级质数。
请问,最大的超级质数是多少?
解析
这题其实是质数排列组合问题,由一位数扩展到更多位一位数是质数的:2,3,5,7扩展到两位数,两两组合剩下23,37,53,73然后再扩展到三位数,就已经得出结论了,373
#include <iostream>
using namespace std;
int main()
{1.10以内的质数有2,3,5,7
2.根据超级质数的组成规则可以组成23,37,53,57,73这样的相邻质数组合,
满足要求的有23,37,53,73
3.根据这些组合可以组成237,373,573,737这样的数字组合,满足要求的只有373
4.根据组成规则已经不能在373的基础之上进行组合,即为最大超级质数 int PANDUAN(int n) {int i;for(i=2;i<n/2;i++) {if(n%i==0) break;}if(i==n/2) return 1;else return 0;
}
int main() {int n;while(1) {scanf("%d",&n);if(n==0) break;int temp=PANDUAN(n);printf("temp = %d \n",temp);}return 0;
}cout<<373;return 0;
}
04 合法日期
合法日期
题目描述
小蓝正在上小学,老师要求同学们在暑假每天记日记。可是小蓝整个暑假都在玩,直到最后一天才想起要记日记。于是小蓝赶紧编了一些日记交给老师。没想到,日记很快就被老师发现了问题,原来小蓝记完8月31日的日记,竟又记了8月32日和8月33日的日记。这显然是有问题的,因为根本没有8月32日和8月33日。
给定一个月份和一个日期,请问2021年有没有这一天。
输入描述
输入的第一行包含一个整数m,表示月份。
第二行包含一个整数d,表示日期。
其中,1≤m≤20,1≤d≤40。
输出描述
如果2021年有m月d日,输入yes,否则输出no。
#include <iostream>
using namespace std;
int main()
{int month[31]={0,31,28,31,30,31,30,31,31,30,31,30,31};int m,d;cin>>m>>d;if(month[m]<d)cout<<"no";else cout<<"yes";return 0;
}
05 纯质数
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。如果一个正整数只有1和它本身两个约数,则称为一个质数(又称素数)。前几个质数是:2,3,5,7,11,13,17,19,23,29,31,37,…。如果一个质数的所有十进制数位都是质数,我们称它为纯质数。例如:2,3,5,7,23,37都是纯质数,而11,13,17,19,29,31不是纯质数。当然1,4,35也不是纯质数。请问,在1到20210605中,有多少个纯质数?
#include <stdio.h>
#include <math.h>
int prime(int n)
{int i;for(i=2;i<=sqrt(n);i++){if(n%i==0)return 0;}return 1;
}
int chunprime(int n)
{int m=n;while(m){if(m%10==2||m%10==3||m%10==5||m%10==7){m=m/10;}else return 0;}return 1;
}
int main(int argc, char *argv[])
{int i,ans=0;for(i=2;i<=20210605;i++){if(chunprime(i)&&prime(i))ans++;}printf("%d",ans);// 请在此输入您的代码return 0;
}
06 方格分割
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
6x6的方格,沿着格子的边线剪开成两部分。要求这两部分的形状完全相同。
如下就是三种可行的分割法。
试计算:包括这3种分法在内,一共有多少种不同的分割方法。注意:旋转对称的属于同一种分割法。
#include<iostream>
using namespace std;
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int ans=0;
int map[7][7]={0};//初始化
void DFS(int x,int y)
{if(x==0||x==6||y==0||y==6){ans++;return;} for(int i=0;i<4;i++)//四个方向{int newx=x+dx[i];int newy=y+dy[i];if(map[newx][newy]==0){map[newx][newy]=1;map[6-newx][6-newy]=1;DFS(newx,newy);map[newx][newy]=0;map[6-newx][6-newy]=0;} }
}
int main()
{map[3][3]=1;//从中心开始,3,3表示中心的点DFS(3,3);cout<<ans/4<<endl;//注意结果除以4return 0;
}
07 旋转
题目描述
图片旋转是对图片最简单的处理方式之一,在本题中,你需要对图片顺时针旋转90度。
我们用一个nxm的二维数组来表示一个图片,例如下面给出一个3×4的图片的例子:
1 3 5 7
9 8 7 6
3 5 9 7
这个图片顺时针旋转90度后的图片如下:
3 9 1
5 8 3
9 7 5
7 6 7
给定初始图片,请计算旋转后的图片。
输入描述
输入的第一行包含两个整数n,m,分别表示行数和列数。接下来n行,每行m个整数,表示给定的图片。图片中的每个元素(像素)为一个值为0至255之间的整数(包含0和255)。
输出描述
输出m行n列,表示旋转后的图片。
输入输出样例
示例
输入
3 4
1 3 5 7
9 8 7 6
3 5 9 7
输出
3 9 1
5 8 3
9 7 5
7 6 7
#include<stdio.h>int main()
{int num[255][255];int n, m;scanf("%d %d", &n, &m);for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){scanf("%d",&num[i][j]);}}for (int i = 0; i < m ; i++){for (int j = n-1; j >=0; j--){printf("%d ", num[j][i]);}printf("\n");}return 0;
}
08 本质上升序列
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝特别喜欢单调递增的事物。在一个字符串中,如果取出若干个字符,将这些字符按照在字符串中的顺序排列后是单调递增的,则成为这个字符串中的一个单调递增子序列。
例如,在字符串lanqiao中,如果取出字符n和q,则nq组成一个单调递增子序列。类似的单调递增子序列还有lng、i、ano等等。小蓝发现,有些子序列虽然位置不同,但是字符序列是一样的,例如取第二个字符和最后一个字符可以取到ao,取最后两个字符也可以取到ao。小蓝认为他们并没有本质不同。
对于一个字符串,小蓝想知道,本质不同的递增子序列有多少个?例
如,对于字符串lanqiao,本质不同的递增子序列有21个。它们分别
是l、a、n、q、i、o、ln、an、lq、aq、nq、ai、lo、ao、no、io、
Inq、anq、Ino、ano、aio。
请问对于以下字符串(共200个小写英文字母,分四行显示):
tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhf
iadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqij
gihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmad
vrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl
#include <bits/stdc++.h>
using namespace std;
int f[210];
int main()
{// 请在此输入您的代码string s = "tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhfiadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqijgihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmadvrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl";for (int i = 0; i < s.size(); i++) f[i] = 1;for (int i = 0; i < s.size(); i++){for (int j = 0; j < i; j++){if (s[i] > s[j]) f[i] += f[j];if (s[i] == s[j]) f[i] = 0;}}int ans = 0;for (int i = 0; i <s.size(); i++)ans += f[i];cout << ans << endl;return 0;
}
09 英文字母
问题描述
输入一个正整数n,输出第n个大写英文字母。
输入格式
输入一行包含一个正整数n。
输出格式
输出一行包含一个字母。
样例输入1
12
样例输出1
L
样例输入2
17
样例输出2
Q
评测用例规模与约定
对于所有评测用例,1≤n≤26。
#include <stdio.h>
#include <stdlib.h>
int main()
{int n;scanf("%d",&n);printf("%c",n+64);return 0;
}
10 平行四边形面积
题目描述
给定一个平行四边形的底边长度l和高度h,求平行四边形的面积。
输入描述
输入的第一行包含一个整数l,表示平行四边形的底边长度。第二行包含一个整数 h,表示平行四边形的高。
其中,1≤l,h≤100
输出描述
输出一个数,表示平行四边形的面积。如果面积为整数,请直接输出这个整数,不带小数点。如果面积不是整数,请四舍五入保留正好一位小数。
输入输出样例
示例1
输入
5
6
输出
30
#include <stdio.h>
#include <stdlib.h>
int main()
{float l,h;float s;int i;scanf("%f%f",&l,&h);s=l*h;i=(int)s;if(i==s){printf("%d",i);}else{printf(".1f",s);}return 0;
}