C语言一菜鸟级


私信TA

用户名:LHL

访问量:63521

签 名:

AC总是意料之外 ^_^

等  级
排  名 47
经  验 11204
参赛次数 5
文章发表 56
年  龄 24
在职情况 在职
学  校 四川工商学院
专  业 通信工程

  自我简介:

C语言 蓝桥杯 ACM 新人 欢迎大佬 前来指导 交流 本人 博客https://fivecc.blog.csdn.net/


标题:全球变暖


你有一张某海域NxN像素的照片,”.”表示海洋、”#”表示陆地,如下所示:


……. 

.##…. 

.##…. 

….##. 

..####. 

…###. 

…….


其中”上下左右”四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。


由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。


例如上图中的海域未来会变成如下样子:


……. 

……. 

……. 

……. 

….#.. 

……. 

…….


请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。


【输入格式】 

第一行包含一个整数N。 (1 <= N <= 1000) 

以下N行N列代表一张海域照片。


照片保证第1行、第1列、第N行、第N列的像素都是海洋。


【输出格式】 

一个整数表示答案。


【输入样例】 

……. 

.##…. 

.##…. 

….##. 

..####. 

…###. 

…….


【输出样例】 

1


【输入样例】 

10 

………. 

.###..###. 

.###..###. 

.########. 

………. 

.###…#.. 

.#.#…#.. 

.###…… 

………. 

………. 

【输出样例】 

资源约定: 

峰值内存消耗(含虚拟机) < 256M 

CPU消耗 < 1000ms





思路: 岛屿最后不得被淹没 即 四个方向有岛屿存在 对本岛屿有贡献 为岛屿时 # 将 岛屿坐标 记录为 +4 对应四个方向对应记录贡献+ 1 输入完毕 找值为 8的 点即可


第一次 找寻 zx()搜索 查找 有多少岛屿 

第二次 找寻 zx2() 搜索 还剩几个岛 找到一个岛(不管这个大岛最后有多少小岛出来) 都全部融掉 (防止 一个岛融成多个岛 重复计算)

 原文   欢迎访问 我的博客


#include <stdio.h>
#include <string.h> 
char s[1002][1002];
 void zx(long int x,long int y)
 {
    if(s[x][y]!='#')return;
    s[x][y]='4';
    zx(x+1,y);
    zx(x-1,y);
    zx(x,y-1);
    zx(x,y+1);
 }
 void zx2(long int x,long int y)
 { 
    if(s[x][y]>='4'&&s[x][y]<='9')//为岛屿则全部淹没(不管这个大岛最后有多少小岛出来)
    {
    s[x][y]='.';
    zx2(x+1,y);
    zx2(x-1,y);
    zx2(x,y-1);
    zx2(x,y+1);
    }
     return;
 }
 int main()
 {long int i,n,j,ans=0,sum=0;
 scanf("%ld",&n);
  for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
  {
    while(1)
    {
     scanf("%c",&s[i][j]);
     if(s[i][j]=='.'||s[i][j]=='#')break;
     }
    }
  for(i=1;i<=n;i++)//找寻多少块岛屿;
  for(j=1;j<=n;j++)
   if(s[i][j]=='#')
     { 
      zx(i,j); //将同一块岛屿 标记防重复 
      ans++;} 
      
  for(i=1;i<=n;i++)//找寻那些块岛屿不会被淹;
  for(j=1;j<=n;j++)
     if(s[i][j]>='4'&&s[i][j]<='9')
     {  s[i-1][j]+=1;
         s[i+1][j]+=1;
         s[i][j-1]+=1;
         s[i][j+1]+=1;
     }
  for(i=1;i<=n;i++)s[1][i]++,s[n][i]++,s[i][1]++,s[i][n]++;//处理边界
  for(i=1;i<=n;i++)//找寻剩多少块岛屿;
  for(j=1;j<=n;j++) 
     if(s[i][j]=='8')
     { 
      zx2(i,j); //将同一块岛屿 标记防重复 
      sum++;} 
 printf("%ld\n",ans-sum);
 return 0;
 }


 

0.0分

2 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区

8
........
.##..##.
.######.
.##..##.
........
........
........
........

这个为啥是 0 ?
2019-03-21 15:39:30
这个代码有点错误吧!下面这个例子我认为正确答案应该是2,但是代码测试数据结果为3
5
##...
...##
#....
##...
##...
2019-02-12 16:03:23
大佬今年还参加比赛吗
2018-12-24 14:16:07
  • «
  • 1
  • »