【海岛帝国系列赛】No.1 海岛帝国:诞辰之日
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 海岛帝国:诞辰之日的更多相关文章
- 【海岛帝国系列赛】No.7 海岛帝国:神圣之日
50237242海岛帝国:神圣之日 [试题描述] 战争持续九个月了.“购物券”WHT的军队还在跟恐怖分子僵持着.WHT和LJX已经向“公务员”告急,情况不宜乐观.YSF为守护帝国决定打开“够累 的”星 ...
- 【海岛帝国系列赛】No.6 海岛帝国:战争前线
50234237海岛帝国:战争前线 [试题描述] 总指挥官WHT出神入化的计谋虽然大有用武之地,但是聪明的恐怖分子们采取了城市核武器防御系统,可以有效地抵制WHT的炸弹.YSF对此头痛不已,因此 召开 ...
- 【海岛帝国系列赛】No.5 海岛帝国:独立之战
50229234海岛帝国:独立之战 [试题描述] 恐怖分子多年来一直如饥似渴地渴求“药师傅”帝国,但是,“里脊肉”BANNIE时刻在守护着这一方水土.从而使帝国日益强大.如今,BANNIE由于在 “牡 ...
- 【海岛帝国系列赛】No.4 海岛帝国:LYF的太空运输站
50212228海岛帝国:LYF的太空运输站 [试题描述] 最近,“购物券”WHT在“药师傅”帝国资源大会上提出了“SSTS”太空运输站计划.由于恐怖分子前些日子刚猖狂完,炸毁高楼无数,YSF不得不执 ...
- 【海岛帝国系列赛】No.3 海岛帝国:运输资源
海岛帝国:运输资源 [试题描述] YSF考虑到“药师傅”帝国现在资源极度不平均,于是,商讨启用南水北调工程.YZM为首席工程师.现在,YSF由于工作紧张,准备军用物资和民用物资.但他要时时关注运输工程 ...
- 【海岛帝国系列赛】No.2 海岛帝国:“落汤鸡”市的黑帮危机
50200210海岛帝国:“落汤鸡”市的黑帮危机 [试题描述] 近几天,犯罪分子发现“药师傅”帝国的警力约等于0.(请见YSF的海岛帝国)于是开始猖狂了起来.他们选择了依山靠水(农村?)的“落汤鸡”市 ...
- 帝国cms7.0忘记后台管理账户用户名密码
最近刚登陆以前的网站,但是发现自己的后台管理用户名密码已经忘记,于是到帝国cms论坛里面找了一下解决方案,成功解决问题.特此分享一下解决成功经验. 原帖地址:http://bbs.phome.net/ ...
- Java开发笔记(四)Java帝国的度量衡
秦始皇统一中国之后,实行“书同文,车同轨”,把货币和各种度量衡都统一起来,从而缔造了一个秩序井然的帝国.既然统一度量衡是每个帝国都要做的事情,Java帝国也不例外,对于人生地不熟的初学者来说,只有认识 ...
- DEDEcms和帝国cms的几点比较
前言:最近有很多人问我DEDEcms和帝国cms哪个比较好,我之前用2个都做过站的,所以能够说出它们大体的区别. 声明:我在此说明的是我一贯用的两种建站体统的感受,没有诋毁或者提升哪个系统!两个系统都 ...
随机推荐
- The identity used to sign the executable is no longer valid.
昨天运行还好好的,今天Xcode突然报这个错误. 在网上搜索了一番,也没有找到合适的解决办法. 那怎么办呢? 于是我就登陆了Appstore的开发者账号,发现里面的证书都是invalid状态,我想应该 ...
- Java学习-018-EXCEL 文件写入实例源代码
众所周知,EXCEL 也是软件测试开发过程中,常用的数据文件导入导出时的类型文件之一,此文主要讲述如何通过 EXCEL 文件中 Sheet 的索引(index)或者 Sheet 名称获取文件中对应 S ...
- 使用Aspose.Cell控件实现Excel高难度报表的生成(二)
继续在上篇<使用Aspose.Cell控件实现Excel高难度报表的生成(一)>随笔基础上,研究探讨基于模板的Aspose.cell报表实现,其中提到了下面两种报表的界面,如下所示: 或者 ...
- li有无缩略图样式调取
<div class="part3list">[field:array runphp='yes']@me = (strpos(@me['litpic'],'defaul ...
- Android Service Intent must be explicit的解决方法
今天在学习Android的Service组件的时候,在AndroidMainfest.xml中定义了 <service android:name=".BindService" ...
- RTOS
1. http://www.nuttx.org/ 2. http://www.rt-thread.org/page/73.html
- 第八篇 SQL Server代理使用外部程序
本篇文章是SQL Server代理系列的第八篇,详细内容请参考原文 在这一系列的上一篇,学习了如何用SQL Server代理作业活动监视器监控作业活动和查看作业历史记录.在实时监控和管理SQL Ser ...
- define 实例
// ----------------------------------------------define------------------------------------- // #def ...
- log4cxx安装和使用
log4cxx是Java社区著名的log4j的c++移植版,用于为C++程序提供日志功能,以便开发者对目标程序进行调试和审计,log4cxx是apache软件基金会的开源项目,基于APR实现跨平台支持 ...
- 创建纯洁的TableViewCell
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPat ...