每日一题
一
P2670 [NOIP2015 普及组] 扫雷游戏
题目描述
扫雷游戏是一款十分经典的单机小游戏。在 nn 行 mm 列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。
现在给出 nn 行 mm 列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。
注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。
输入格式
第一行是用一个空格隔开的两个整数 nn 和 mm,分别表示雷区的行数和列数。
接下来 nn 行,每行 mm 个字符,描述了雷区中的地雷分布情况。字符 \texttt{*}* 表示相应格子是地雷格,字符 \texttt{?}? 表示相应格子是非地雷格。相邻字符之间无分隔符。
输出格式
输出文件包含 nn 行,每行 mm 个字符,描述整个雷区。用 \texttt{*}* 表示地雷格,用周围的地雷个数表示非地雷格。相邻字符之间无分隔符。
题目描述
扫雷游戏是一款十分经典的单机小游戏。在 nn 行 mm 列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。
现在给出 nn 行 mm 列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。
注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。
输入格式
第一行是用一个空格隔开的两个整数 nn 和 mm,分别表示雷区的行数和列数。
接下来 nn 行,每行 mm 个字符,描述了雷区中的地雷分布情况。字符 \texttt{*}* 表示相应格子是地雷格,字符 \texttt{?}? 表示相应格子是非地雷格。相邻字符之间无分隔符。
输出格式
输出文件包含 nn 行,每行 mm 个字符,描述整个雷区。用 \texttt{*}* 表示地雷格,用周围的地雷个数表示非地雷格。相邻字符之间无分隔符。
思路
依次计算a[i]周围“*”的个数,若a[i]为雷则输出“*”否则输出周围雷的个数。
1 #include <stdio.h> 2 int main(){ 3 char a[150][150]; 4 char b[150][150]={0}; 5 int n,m; 6 int i,j; 7 scanf("%d %d\n",&n,&m); 8 for(i=0;i<n;i++){ 9 for(j=0;j<m;j++){ 10 scanf("%c",&a[i][j]); 11 } 12 getchar(); 13 } 14 for(i=0;i<n;i++){ 15 for(j=0;j<m;j++){ 16 if(a[i][j]=='*'){ 17 b[i][j]='*'; 18 }else{ 19 if(a[i][j+1]=='*')b[i][j]++; 20 if(a[i][j-1]=='*')b[i][j]++; 21 if(a[i-1][j+1]=='*')b[i][j]++; 22 if(a[i-1][j]=='*')b[i][j]++; 23 if(a[i-1][j-1]=='*')b[i][j]++; 24 if(a[i+1][j+1]=='*')b[i][j]++; 25 if(a[i+1][j]=='*')b[i][j]++; 26 if(a[i+1][j-1]=='*')b[i][j]++; 27 28 } 29 } 30 } 31 for(i=0;i<n;i++){ 32 for(j=0;j<m;j++){ 33 if(a[i][j]=='*')printf("*"); 34 else{ 35 printf("%d",b[i][j]); 36 } 37 } 38 printf("\n"); 39 } 40 return 0; 41 42 }
二
P1059 [NOIP2006 普及组] 明明的随机数
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 NN 个 11 到 10001000 之间的随机整数 (N\leq100)(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
输入格式
输入有两行,第 11 行为 11 个正整数,表示所生成的随机数的个数 NN。
第 22 行有 NN 个用空格隔开的正整数,为所产生的随机数。
输出格式
输出也是两行,第 11 行为 11 个正整数 MM,表示不相同的随机数的个数。
第 22 行为 MM 个用空格隔开的正整数,为从小到大排好序的不相同的随机数。
思路
从小到大排序,去掉重复的数字。
1 #include <stdio.h> 2 int main(){ 3 int num[100],N; 4 int i,j,min; 5 scanf("%d",&N); 6 for(i=0;i<N;i++){ 7 scanf("%d",&num[i]); 8 } 9 for(i=0;i<N;i++){ 10 for(j=i+1;j<N;j++){ 11 if(num[j]<num[i]){ 12 min=num[j]; 13 num[j]=num[i]; 14 num[i]=min; 15 } 16 } 17 } 18 for(i=1;i<N;i++){ 19 if(num[i]-num[i-1]==0){ 20 for(j=i;j<N-1;j++){ 21 num[j]=num[j+1]; 22 } 23 i--; 24 N=N-1; 25 } 26 } 27 printf("%d\n",N); 28 for(i=0;i<N;i++){ 29 printf("%d ",num[i]); 30 31 } 32 return 0; 33 }
三
P2676 [USACO07DEC]Bookshelf B
Farmer John最近为奶牛们的图书馆添置了一个巨大的书架,尽管它是如此的大,但它还是几乎瞬间就被各种各样的书塞满了。现在,只有书架的顶上还留有一点空间。
所有 N(1 \le N \le 20,000)N(1≤N≤20,000) 头奶牛都有一个确定的身高 H_i(1 \le H_i \le 10,000)Hi(1≤Hi≤10,000)。设所有奶牛身高的和为S。书架的高度为B,并且保证 1 \le B \le S < 2,000,000,0071≤B≤S<2,000,000,007。
为了够到比最高的那头奶牛还要高的书架顶,奶牛们不得不像演杂技一般,一头站在另一头的背上,叠成一座“奶牛塔”。当然,这个塔的高度,就是塔中所有奶牛的身高之和。为了往书架顶上放东西,所有奶牛的身高和必须不小于书架的高度。
显然,塔中的奶牛数目越多,整座塔就越不稳定,于是奶牛们希望在能够到书架顶的前提下,让塔中奶牛的数目尽量少。 现在,奶牛们找到了你,希望你帮她们计算这个最小的数目。
输入格式
- 第 11 行: 2 个用空格隔开的整数:NN 和 BB;
- 第 2\dots N+12…N+1 行: 第 i+1i+1 行是 11 个整数:H_iHi。
输出格式
- 第 11 行: 输出 11 个整数,即最少要多少头奶牛叠成塔,才能够到书架顶部
1 #include <stdio.h> 2 int main(){ 3 int N,B,H[20000]; 4 int height=0,i,max,j; 5 scanf("%d %d\n",&N,&B); 6 for(i=0;i<N;i++){ 7 scanf("%d",&H[i]); 8 }
//从高到低排列 9 for(i=0;i<N;i++){ 10 for(j=i+1;j<N;j++){ 11 if(H[j]>H[i]){ 12 max=H[j]; 13 H[j]=H[i]; 14 H[i]=max; 15 } 16 } 17 }
//从高到低依次相加 18 for(i=0;height<=B;i++){ 19 height+=H[i]; 20 } 21 printf("%d",i); 22 return 0; 23 }四
P1075 [NOIP2012 普及组] 质因数分解
-
题目描述
已知正整数 nn 是两个不同的质数的乘积,试求出两者中较大的那个质数。
输入格式
输入一个正整数 nn。
输出格式
输出一个正整数 pp,即较大的那个质数。
#include <stdio.h> #include <math.h> int max(int,int); int zhishu(int); int main(){ int num,i,maxyue,k; scanf("%d",&num); for(i=2;i<sqrt(num);i++){ if(k=zhishu(i)){ //判断是否为质数 if(num%i==0){ //判断是否可以整除 maxyue=max(i,num/i); //两个因数比较大小 } }else{ continue; } } printf("%d",maxyue); return 0; } int max(int a,int b){ int k=b; if(a>b){ k=a; } return k; } int zhishu(int a){ int k=1; int i; for(i=2;i<a/2;i++){ if(a%i==0){ k=0; break; } } return k; }
五
P5743 【深基7.习8】猴子吃桃
-
一只小猴买了若干个桃子。第一天他刚好吃了这些桃子的一半,又贪嘴多吃了一个;接下来的每一天它都会吃剩余的桃子的一半外加一个。第 n天早上起来一看,只剩下 1 个桃子了。请问小猴买了几个桃子?
输入格式
输入一个正整数 n,表示天数。
输出格式
输出小猴买了多少个桃子。
思路
反推:第n天:1个;
第n-1天:(1+1)*2=4个
第n-2天:(4+1)*2=10个
-------
第一天即为第二天所剩的桃子数加1再乘以2。
1 #include <stdio.h> 2 int main(){ 3 int n,i,num=1; 4 scanf("%d",&n); 5 for(i=1;i<n;i++){ 6 num++; 7 num*=2; 8 } 9 printf("%d",num); 10 return 0; 11 }
六
P5734 【深基6.例6】文字处理软件
你需要开发一款文字处理软件。最开始时输入一个字符串作为初始文档。可以认为文档开头是第 00 个字符。需要支持以下操作:
-
1 str:后接插入,在文档后面插入字符串 \texttt{str}str,并输出文档的字符串。 -
2 a b:截取文档部分,只保留文档中从第 aa 个字符起 bb 个字符,并输出文档的字符串。 -
3 a str:插入片段,在文档中第 aa 个字符前面插入字符串 \texttt{str}str,并输出文档的字符串。 -
4 str:查找子串,查找字符串 \texttt{str}str 在文档中最先的位置并输出;如果找不到输出 -1−1。
为了简化问题,规定初始的文档和每次操作中的 \texttt{str}str 都不含有空格或换行。最多会有 qq 次操作。
输入格式
第一行输入一个正整数 qq,表示操作次数。
第二行输入一个字符串 \texttt{str}str,表示最开始的字符串。
第三行开始,往下 qq 行,每行表示一个操作,操作如题目描述所示。
输出格式
一共输出 nn 行。
对于每个操作 1,2,31,2,3,根据操作的要求输出一个字符串。
对于操作 44,根据操作的要求输出一个整数。
#include <stdio.h> #include <string.h> int main(){ char a[1500]; char b[1500],c[1500]; int n,i,k,o,p,m; scanf("%d",&n); scanf("%s",a); for(i=0;i<n;i++){ scanf("%d",&k); switch(k){ //输入操作 case 1: scanf("%s",b); strcat(a,b); printf("%s\n",a); break; case 2: scanf("%d %d",&o,&p); a[o+p]='\0'; strcpy(c,&a[o]); strcpy(a,c); printf("%s\n",a); break; case 3: scanf("%d %s",&m,c); strcat(c,&a[m]); a[m]='\0'; strcat(a,c); printf("%s\n",a); break; case 4: scanf("%s",c); char*r=strstr(a,c); //查找字符串a最早出现字符串c的位置若存在这返回第一次出现的地址,若地址不存在返回NUll if(r==NULL){ printf("-1\n"); } else{ strcpy(c,r); //拷贝字符串从c位置开始的字符串到r去 printf("%d\n",strlen(a)-strlen(c)); //两个字符串数组长度相减 } break; } } return 0; }

浙公网安备 33010602011771号