牛客竞赛题库(NC52069)

#include<stdio.h>
#include<string.h>
  
int main()
{
    int n, m;
    char a[1002][1002];
    int count = 0;
      
    scanf("%d %d", &n, &m);
    getchar();
      
    for (int i = 0; i < n; i++)
    {
        fgets(a[i], 1002, stdin);
        a[i][strcspn(a[i], "\n")] = '\0';
    }
    for(int i = 0;i < n;i++)
    {  
        for(int j = 0;j < m;j++)
        { 
            if(a[i][j]!='*')
            {
                count=0;
               for (int k = (i - 1 < 0? 0 : i - 1); k <= (i + 1 >= n? n - 1 : i + 1); k++) 
               {
                    for (int l = (j - 1 < 0? 0 : j - 1); l <= (j + 1 >= m? m - 1 : j + 1); l++) 
                    {
                        if (a[k][l] == '*') 
                        {
                            count++;
                        }
                    }
               }
			    a[i][j]=count+48;
            }
        }
    }
     
    for (int i = 0; i < n; i++)
    {
        puts(a[i]);
    }
    return 0;
}

首先说一下头文件,stdio.h是提供这个代码中的fgets输入函数,string.h提供了strcspn字符串操作函数。

这里定义了n,m;用于储存二维字符数组a的行数和列数,这里的a[1002][1002]是一个二维字符数组,用于储存数据,为什么是1002,因为根据题目中备注的范围,我们需要取比1000大的数,防止溢出,count用于记步数。

第11行的getchar()用于读取并丢弃输入中scanf之后残留的换行符,防止影响后续fgets的输入。

这里讲解一下fgets和strcspn函数

fgets函数

函数原型:char *fgets(char *str, int n, FILE *stream)

str: 指向字符数组的指针,用于存储读取到的字符串。

n:一个整数,表示要读取的最大字符数(包括字符串结束符'\0')。如果读取到n-1个字符或遇到换行符'\n'时,读取操作就会停止。

stream:指向FILE类型的指针,表示输入流,常用的是stdin(标准输入流,即从键盘输入)。

功能:如果成功读取字符串,返回指向存储字符串的字符数组str的指针;如果发生错误,返回NULL。

strcspn函数

函数原型:size_t strcspn(const char *str1, const char *str2);

str1:指向要进行搜索的字符串的指针。

str2:指向包含要搜索字符的字符串的指针。

功能:简单来说,就是返回str1中不包含str2中字符的前缀长度。

举个小例子(这里不详细写完整代码,只是辅助理解该函数):

char str1[] = "hello world";
char str2[] = "w";
size_t res = strcspn(str1, str2);
printf("%zu\n", result);

这里返回的结果是6,因为从str1的开头到'w'前面的字符数是6(即hello和一个空格)

for (int i = 0; i < n; i++)
    {
        fgets(a[i], 1002, stdin);
        a[i][strcspn(a[i], "\n")] = '\0';
    }

这里利用for循环,利用fgets函数输入字符串到二维数组a中,fgets最多读取1001个字符(第1002个位置留给字符串结束符'\0')。利用strcspn函数找到a[i]字符串中换行符'\n'的位置,然后然后将该位置的字符替换为字符串结束符'\0',从而达到去除换行符的目的。

   for(int i = 0;i < n;i++)
    {  
        for(int j = 0;j < m;j++)
        { 
            if(a[i][j]!='*')
            {
                count=0;
               for (int k = (i - 1 < 0? 0 : i - 1); k <= (i + 1 >= n? n - 1 : i + 1); k++) 
               {
                    for (int l = (j - 1 < 0? 0 : j - 1); l <= (j + 1 >= m? m - 1 : j + 1); l++) 
                    {
                        if (a[k][l] == '*') 
                        {
                            count++;
                        }
                    }
               }
			   a[i][j]=count+48;
            }
        }
    }

外层两个嵌套的for循环用于遍历二维数组a的每一个元素,当元素a[i][j]不是'*'时,进入内层两个嵌套的for循环,用于遍历该元素周边的元素(包括自身位置)。如果周边元素是'*',则count自增。最后将统计得到的count加上48(48是字符'0'的ACSll码值,这样做是将数字转换为对应字符),储存到a[i][j]位置,并将count重置为0。

我们举个例子讲解一下运行过程,便于理解

for (int i = 0; i < n; i++)
    {
        puts(a[i]);
    }

通过for循环逐行使用puts函数输出处理后的矩阵a,puts函数会自动在输出字符串后面添加换行符。

牛客竞赛题库(C语言) 文章被收录于专栏

这是我对题库写的代码以及分析,由易到难,我会坚持把它写完,可能有些粗糙,专栏免费,不想看可以划走。

全部评论

相关推荐

真实工作体验!【工作时间】&nbsp;海康实行弹性工作制,一般九点半之前到公司就可以。对于实习生来说,一般只要打够八个半小时的卡就好了。这点还是不错的,早点上班就可以早点下班。正式工可能需要大小周,具体看部门要求。实习生应该都是双休的,不过周末去的话也会给你发工资。中午休息一个半小时,大部分员工都会自己买午休床。&nbsp;【公司环境】&nbsp;实习报到的时候会给你分配一台电脑,一般都是无盘机,配置很普通,不允许自己带电脑。海康对网络管控比较严格,很多网站不能访问。想要访问外网的话只能通过虚拟机,然后通过公司内部的文件传输工具传到红网,这点还是比较麻烦的。&nbsp;海康食堂还行,样式挺丰富的,价格也不贵。早餐我一般在5-10r,午饭一般15-20r。海康有专人负责检测食堂饭菜农药残留,细菌达标情况,饮水机水质这些东西,定期会出检测报告。正式工貌似八点半之前到公司可以拿20餐补,实习生没有任何补贴,这点比那些互联网公司待遇差一点。公司里面还有便利店、水果店、面包房啥的,海康员工好像有折扣价,比外面便宜一点。公共区域有办公用品柜,直接刷工牌就能免费领本子,笔之类的文具。&nbsp;公司里面还有健身房,一期、二期的比较小,没有淋浴间,三期健身房挺大的,有淋浴间。四期、五期也有健身房,不过我没去过。&nbsp;【工作氛围】&nbsp;实习生工作强度还行,压力不会很大。海康这边应该是给每个实习生都配备了一个mentor,他会给你安排任务,有什么问题也可以向他请教。身边的同事也都很好相处,我们组吃饭的时候都是一起去的,感觉和学校实验室差不多,身边的同事也都挺年轻的。&nbsp;海康这边活动还挺多的,部门每个季度还会安排团建,我入职的那周正好赶上了。研究院这边还有一些活动社团,有羽毛球社、健身社、音乐社,每周都会安排活动,健身社有教练带练,羽毛球社每周会租一片场地,免费提供羽毛球。海康威视2025届春招补招开启【关于我们】海康威视成立于2001年,是一家专注技术创新的科技公司,致力于将物联感知、人工智能、大数据技术服务于干行百业,引领智能物联新未来【招聘岗位】综合类(人力、会计、运营、商务)、营销/技术支持类、算法/网米哈游TCL络安全/大数据类、器件电路类、软件/嵌入式类、硬件/结构类、测试/支撑类、供应链类、体验设计类【工作地点】杭州、武汉、西安、成都、上海、北京、石家庄、全国90+城市和海外多地【福利待遇】有竞争力的薪资+影响世界的宽广舞台+持续可期的成长回报+踏实专注的做事氛围+接轨市场的创新实践【投递链接】http://campushr.hikvision.com/【内推码】MXA4QC(简历优先筛选,后续有流程上的问题欢迎随时联系)使用内推码简历优先筛选,有任何问题包括进度查询可以私信我,内推后在评论区留言【姓名缩写+岗位】,方便捞人和确认投递状 #25届#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#校招#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#内推#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#海康威视#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#实习#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务