50111117海岛帝国:诞辰之日

【试题描述】

YSF自从上次“被盗投降”完(带着一大堆债)回去以后,YSF对“海盗”怀念至今,他想要建立一个“药师傅”海岛帝国。

今天,他要像“管理部”那样去探寻一个新大陆!由于YSF得到了“郭同学”TONY.STARK的赞助。买了好多好多“旧手机”。

从而以某种不法行为GET航拍地图一张!YSF开着热气球,踏(jiu)上(zuo)了(qi)征(le)程(meng)。

YSF跳伞到了一个岛上,由于YSF素有幸运儿之称,所以幸运的他降落在了最大的小岛,但是,YSF一直想了解地图中别的岛,所以请你告诉天(tong)下(xin)闻(wei)名(min)而且还在做梦的YSF,地图上一共有几个小岛,最大的(YSF自己降落的小岛)小岛有多大?(温馨提示:数字表示海拔。0表示海洋,1~9都表示陆地。此处我们把YSF的跳伞点上下左右相连接陆地均视为同一岛屿,海拔不是面积!)

输入要求

* 第一行两个整数:n,m,分别表示地图的行和列。
* 接下来的n行m列为地图。

输出要求

* 共两行,第一行为小岛的个数N,输出:有N个小岛!
* 第二行为最大的小岛的面积M,输出:YSF降落的小岛面积有M!

输入实例


输出实例

有4个小岛!
YSF降落的小岛面积有38!

其它说明

地图的大小不超过50*50

试题分析

当时刚出过这样的一个乱搞而且把N个方法融合到一起的题,第一反应就是:打dfs+暴力+染色。这当然是最简单粗暴的方法。而且时间复杂度貌似不超啊~~~,所以就乱搞了这样的一个代码,每个点狂搜一遍,然后取最大值就可以求出ans2,但是,ans1怎么求呢?我们知道,目前只搜最大岛的面积函数只要两个参数,分别是x和y,表示YSF的坐标。而我们可以使用染色方法,对于每块走过的陆地染色。实现这个要求可以在我们的DFS函数里加上这样一个参数:color。原来的DFS如下:

 void dfs(int x,int y)
{
//定义一个方向数组
int next[][]={{,},//向右走
{,},//向下走
{,-},//向左走
{-,}};//向上走
int tx,ty,k;
//枚举前进方向
for(k=;k<=;k++)
{
//下一步后的坐标
tx=x+next[k][];
ty=y+next[k][];
if(tx< || tx>n || ty< || ty>m) continue;//边界判断、
//陆地判断
if(a[tx][ty]> && book[tx][ty]==)
{
sum++;//答案+1
book[tx][ty]=;//标记为已走过
dfs(tx,ty);//枚举下一个点
}
}
return ;
}

改进后的DFS只加了一行,可功能大大提升了

 void dfs(int x,int y,int color)
{
//定义一个方向数组
int next[][]={{,},//向右走
{,},//向下走
{,-},//向左走
{-,}};//向上走
int tx,ty,k;
a[x][y]=color;//对这个格子染色
//枚举前进方向
for(k=;k<=;k++)
{
//下一步后的坐标
tx=x+next[k][];
ty=y+next[k][];
if(tx< || tx>n || ty< || ty>m) continue;//边界判断、
//陆地判断
if(a[tx][ty]> && book[tx][ty]==)
{
sum++;//答案+1
book[tx][ty]=;//标记为已走过
dfs(tx,ty,color);//枚举下一个点
}
}
return ;
}

那么,既然染完色了,拿地图不就变成染色后的了吗?

想一想,有必要担心吗?

DFS1完全不会改变地图,只有DFS2会,我们先求DFS1,再求DFS2。

DFS1只会改变BOOK数组,而即使DFS1会改变地图,拿我们可以直接备份一个地图啊。

所以,可以放心的写代码了~~~

【代码】

 #include<iostream>
using namespace std;
int a[][];
int book[][],n,m,sum,ans=-,book2[][],sum1;
void dfs(int x,int y)
{
int next[][]={{,},
{,},
{,-},
{-,}};
int tx,ty,k;
for(k=;k<=;k++)
{
tx=x+next[k][];
ty=y+next[k][];
if(tx< || tx>n || ty< || ty>m) continue;
if(a[tx][ty]> && book[tx][ty]==)
{
sum++;
book[tx][ty]=;
dfs(tx,ty);
}
}
return ;
}
void dfs2(int x,int y,int color)
{
int next[][]={{,},
{,},
{,-},
{-,}};
int tx,ty,k;
a[x][y]=color;
for(k=;k<=;k++)
{
tx=x+next[k][];
ty=y+next[k][];
if(tx< || tx>n || ty< || ty>m) continue;
if(a[tx][ty]> && book2[tx][ty]==)
{
sum1++;
book2[tx][ty]=;
dfs2(tx,ty,color);
}
}
return ;
}
int main()
{
int startx,starty,num=;
cin>>n>>m;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
cin>>a[i][j];
for(startx=;startx<=n;startx++)
for(starty=;starty<=m;starty++)
{
book[startx][starty]=;
dfs(startx,starty);
book[startx][starty]=;
if(sum>ans) ans=sum;
sum=;
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(a[i][j]>)
{
num--;
book2[i][j]=;
dfs2(i,j,num);
}
printf("有%d个小岛!\nYSF降落的小岛面积有%d!\n",-num,ans);
}

【海岛帝国系列赛】No.1 海岛帝国:诞辰之日的更多相关文章

  1. 【海岛帝国系列赛】No.7 海岛帝国:神圣之日

    50237242海岛帝国:神圣之日 [试题描述] 战争持续九个月了.“购物券”WHT的军队还在跟恐怖分子僵持着.WHT和LJX已经向“公务员”告急,情况不宜乐观.YSF为守护帝国决定打开“够累 的”星 ...

  2. 【海岛帝国系列赛】No.6 海岛帝国:战争前线

    50234237海岛帝国:战争前线 [试题描述] 总指挥官WHT出神入化的计谋虽然大有用武之地,但是聪明的恐怖分子们采取了城市核武器防御系统,可以有效地抵制WHT的炸弹.YSF对此头痛不已,因此 召开 ...

  3. 【海岛帝国系列赛】No.5 海岛帝国:独立之战

    50229234海岛帝国:独立之战 [试题描述] 恐怖分子多年来一直如饥似渴地渴求“药师傅”帝国,但是,“里脊肉”BANNIE时刻在守护着这一方水土.从而使帝国日益强大.如今,BANNIE由于在 “牡 ...

  4. 【海岛帝国系列赛】No.4 海岛帝国:LYF的太空运输站

    50212228海岛帝国:LYF的太空运输站 [试题描述] 最近,“购物券”WHT在“药师傅”帝国资源大会上提出了“SSTS”太空运输站计划.由于恐怖分子前些日子刚猖狂完,炸毁高楼无数,YSF不得不执 ...

  5. 【海岛帝国系列赛】No.3 海岛帝国:运输资源

    海岛帝国:运输资源 [试题描述] YSF考虑到“药师傅”帝国现在资源极度不平均,于是,商讨启用南水北调工程.YZM为首席工程师.现在,YSF由于工作紧张,准备军用物资和民用物资.但他要时时关注运输工程 ...

  6. 【海岛帝国系列赛】No.2 海岛帝国:“落汤鸡”市的黑帮危机

    50200210海岛帝国:“落汤鸡”市的黑帮危机 [试题描述] 近几天,犯罪分子发现“药师傅”帝国的警力约等于0.(请见YSF的海岛帝国)于是开始猖狂了起来.他们选择了依山靠水(农村?)的“落汤鸡”市 ...

  7. 帝国cms7.0忘记后台管理账户用户名密码

    最近刚登陆以前的网站,但是发现自己的后台管理用户名密码已经忘记,于是到帝国cms论坛里面找了一下解决方案,成功解决问题.特此分享一下解决成功经验. 原帖地址:http://bbs.phome.net/ ...

  8. Java开发笔记(四)Java帝国的度量衡

    秦始皇统一中国之后,实行“书同文,车同轨”,把货币和各种度量衡都统一起来,从而缔造了一个秩序井然的帝国.既然统一度量衡是每个帝国都要做的事情,Java帝国也不例外,对于人生地不熟的初学者来说,只有认识 ...

  9. DEDEcms和帝国cms的几点比较

    前言:最近有很多人问我DEDEcms和帝国cms哪个比较好,我之前用2个都做过站的,所以能够说出它们大体的区别. 声明:我在此说明的是我一贯用的两种建站体统的感受,没有诋毁或者提升哪个系统!两个系统都 ...

随机推荐

  1. HTML知识点总结以及典型例子讲解

    一.HTML文本格式化标签(这些标签都不换行) eg: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&qu ...

  2. iOS _BSMachError: (os/kern) invalid capability (20)

    _BSMachError: (os/kern) invalid capability (20) 解决办法:将info.plist里面的en改为United States 2016-04-18 22:4 ...

  3. 进度太慢了,扫频仪PCB

    实在是画过最纠结的一块PCB,左边布线很轻松,但是右边32芯片用到FSMC,还有很多个引出的IO口,相互交叉纠结在了一起,有几根线一路打了3,4个过孔,实在是难布. 工程查了下是6月17号画原理图的, ...

  4. echo 命令

    echo 命令 -n:表示不换行: -e:对特殊字符的解释执行,比如说变色: 例: [root@bogon ~]# echo -n "test"test[root@bogon ~] ...

  5. 四元数(Quaternion)和旋转(转)

    http://blog.csdn.net/candycat1992/article/details/41254799 四元数介绍 旋转,应该是三种坐标变换--缩放.旋转和平移,中最复杂的一种了.大家应 ...

  6. WCF第一个Demo

    参考文献:http://www.cnblogs.com/artech/archive/2007/02/26/656901.html 自己学习的Demo 第一个是控制台宿主服务,第二个是Windows服 ...

  7. 苹果API常用英语名词

    0. indicating决定 1.in order to 以便 2.rectangle bounds 矩形尺寸 3.applied 应用 4.entirety全部 5.technique 方法 6. ...

  8. block数据类型

    // //  main.m //  04-block数据类型 // //  Created by apple on 14-3-18. //  Copyright (c) 2014年 apple. Al ...

  9. 异常信息:由于内部错误,服务器无法处理该请求。有关该错误的详细信息,请打开服务器上的 IncludeExceptionDetailInFaults

    有方法说找到web.config 文件修改如下(蓝色部分) <behaviors>      <serviceBehaviors>        <behavior> ...

  10. Java基础之创建窗口——创建应用程序窗口(TryWindow)

    控制台程序. 准备好应用程序窗口及其包含的组件并显示,这称为实现窗口.调用应用程序窗口对象的setVisible()方法就会实现窗口.实现了应用程序的GUI之后,在主线程中修改或查询GUI可能会导致死 ...