【海岛帝国系列赛】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个都做过站的,所以能够说出它们大体的区别. 声明:我在此说明的是我一贯用的两种建站体统的感受,没有诋毁或者提升哪个系统!两个系统都 ...
随机推荐
- 【C++】利用指针实现通过函数改变多个参数的值
写惯了python,对于C++的语法越来越生疏,不同于python中函数可以return多个变量,C++的函数要想返回多个参数可以利用指针实现. 因为在函数内部的变量都是局部变量,所以当参数传入函数中 ...
- hdu1241 Oil Deposits
Oil Deposits Time Limit: 2000/1000 MS (Java/Others) ...
- HTML标签的改变
/*这些都是前端面试中经常考到的内容,必须要掌握的*/ 一.新的文档类型声明(DTD) 1.HTML5的DTD声明为:<!doctype html>或者<!DOCTYPE html& ...
- Java学习-024-获取当前类名或方法名二三文
今天,看朋友编写程序,打印日志时,需要记录当前类的类名以及当前方法的方法名,我发现 TA 将类名或者方法名直接写死在了代码中...虽说这样可以实现记录类名和方法名,但是当有特殊情况需要修改类名或者方法 ...
- LeetCode Shortest Word Distance II
原题链接在这里:https://leetcode.com/problems/shortest-word-distance-ii/ 题目: This is a follow up of Shortest ...
- CSS:选择器大全
一.概念: CSS主要的作用就是给网页中的dom元素设置样式,选择器则是用来匹配dom元素的. CSS中的选择器有很多种,常用的分别是标签选择器(根据元素标签名称),类选择器(根据元素class属性) ...
- linux下利用elk+redis 搭建日志分析平台教程
linux下利用elk+redis 搭建日志分析平台教程 http://www.alliedjeep.com/18084.htm elk 日志分析+redis数据库可以创建一个不错的日志分析平台了 ...
- 跳到下个View
nextWebView = [[ WEBViewController alloc ] initWithNibName : @"WEBViewController" bundle : ...
- C# js asp.net 字符串MD5加密GetMD5Hash
赵小虎老师 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sy ...
- Java基础之创建窗口——创建应用程序窗口(TryWindow)
控制台程序. 准备好应用程序窗口及其包含的组件并显示,这称为实现窗口.调用应用程序窗口对象的setVisible()方法就会实现窗口.实现了应用程序的GUI之后,在主线程中修改或查询GUI可能会导致死 ...