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. A Guide to Creating a Quality Project Schedule

    Successful projects start with a good quality project schedule. Creating a schedule is one of the fi ...

  2. documentElement和ownerDocument和ownerElement

    1.document.documentElement是指文档根节点----HTML元素 2.element.ownerDocument是指当前元素所在的文档对象----document 3.attrO ...

  3. JMeter学习-011-JMeter 后置处理器实例之 - 正则表达式提取器(三)多参数获取进阶引用篇

    前两篇文章分表讲述了 后置处理器 - 正则表达式提取器概述及简单实例.多参数获取,相应博文敬请参阅 简单实例.多参数获取. 此文主要讲述如何引用正则表达式提取器获取的数据信息.其实,正则表达式提取器获 ...

  4. js判断是电脑访问手机版网站,跳转到电脑版

    function uaredirect(murl,wurl){ //murl为手机网站域名,wurl为电脑版网站域名地址 67 try { 68 if(document.getElementById( ...

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

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

  6. 添加 Gradle 依赖与 build.gradle 配置初识

    添加 Gradle 我们可以到我们添加 Maven 依赖的网站 Maven Repository: Search/Browse/Explore http://mvnrepository.com/ 上查 ...

  7. sublime3使用

    http://dengo.org/archives/923 这篇博客的写的很好!

  8. saltstack之(六)配置管理state

    配置管理是saltstack工具最重要的模块之一,也是学习saltstack之后使用最多的一个功能.可以轻松实现上百台上千台甚至上万台服务器的管理工作. 1.使用state模块进行配置管理,编写sls ...

  9. 第二篇 SQL Server安全验证

    本篇文章是SQL Server安全系列的第二篇,详细内容请参考原文. 验证是检验主体的过程.主体需要唯一标识,那样SQL Server可以确定主体有哪些权限.正确的验证是提供安全访问数据库对象的必要的 ...

  10. Java学习——对象和类

    1. 入门例子 package jihite; public class Dog{ int dogage; public Dog(String name){ System.out.println(&q ...