每日一题

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)(N100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

输入格式

输入有两行,第 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(1N20,000) 头奶牛都有一个确定的身高 H_i(1 \le H_i \le 10,000)Hi(1Hi10,000)。设所有奶牛身高的和为S。书架的高度为B,并且保证 1 \le B \le S < 2,000,000,0071BS<2,000,000,007。

为了够到比最高的那头奶牛还要高的书架顶,奶牛们不得不像演杂技一般,一头站在另一头的背上,叠成一座“奶牛塔”。当然,这个塔的高度,就是塔中所有奶牛的身高之和。为了往书架顶上放东西,所有奶牛的身高和必须不小于书架的高度。

显然,塔中的奶牛数目越多,整座塔就越不稳定,于是奶牛们希望在能够到书架顶的前提下,让塔中奶牛的数目尽量少。 现在,奶牛们找到了你,希望你帮她们计算这个最小的数目。

输入格式

  • 第 11 行: 2 个用空格隔开的整数:NN 和 BB;
  • 第 2\dots N+12N+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 在文档中最先的位置并输出;如果找不到输出 -11。

为了简化问题,规定初始的文档和每次操作中的 \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;
}

 

           

 

posted @ 2023-01-08 17:43  清风南鸢、  阅读(175)  评论(0)    收藏  举报