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;//注意结果除以4
return 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;
}