码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 3329

时间:2014-12-15 01:21:55      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:des   blog   http   io   ar   os   sp   for   java   

The Flood

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 621    Accepted Submission(s): 254


Problem Description
Global warming has us all thinking of rising oceans — well, maybe only those of us who live near the ocean. The small island nation of Gonnasinka has employed you to answer some questions for them. In particular they want to know how high the water has to get before their island becomes two islands (or more).

Given a grid of integers giving the altitudes of the island, how high must the ocean rise before the land splits into pieces?
 

 

Input
Each test case begins with a line containing two positive integers nm giving the dimensions of the igrid, then n lines each containing m positive integers. The integers indicate the original altitude of the grid elements. Grid elements are considered to be adjacent only if they share a horizontal or vertical edge. Values of zero (0) along the perimeter, and all zero cells connected to these, are ocean at its initial level. Cells of 0 not connected to the perimeter (that is, surrounded by higher land) are simply sea level elevations. Furthermore, assume the ocean initially surrounds the given grid. The island is initially connected. Neither n nor m will exceed 100 and heights will never exceed 1000. A line with 0 0 follows the last test case.
 

 

Output
For each test case output one of the two following lines.
Case n: Island splits when ocean rises f feet.
or
Case n: Island never splits.
Our convention here is if your answer is, say, 5 feet, you more accurately mean “5 feet plus a little more.” That is, at least a little water will be flowing over the originally 5 foot high portion of land.
 

 

Sample Input
5 5 3 4 3 0 0 3 5 5 4 3 2 5 4 4 3 1 3 0 0 0 1 2 1 0 0 5 5 5 5 5 5 7 4 1 1 1 4 4 1 2 1 3 7 1 0 0 4 7 3 4 4 4 0 0
 

 

Sample Output
Case 1: Island never splits. Case 2: Island splits when ocean rises 3 feet.
 

 

Source
 

 

Recommend
 
水题。。。逗比了,,,代码能力弱出翔了。。。上一大神代码。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<string>
#include<queue>
#include<vector>
#include<set>
using namespace std;
const int MAX=105;
int grid[MAX][MAX];
bool vis[MAX][MAX];
int d[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
int n,m;
int max(int a,int b)
{
	return a>b?a:b;
}
void dfs(int i,int j,int h)
{
	if(i<1||j<1||i>n||j>m||vis[i][j]||grid[i][j]>h)
		return;
	vis[i][j]=true;
	grid[i][j]=0;
	for(int k=0;k<4;k++)
		dfs(i+d[k][0],j+d[k][1],h);
}
void dfs2(int i,int j)
{
	if(i<1||j<1||i>n||j>m||vis[i][j]||(!grid[i][j]))
		return;
	vis[i][j]=true;
	for(int k=0;k<4;k++)
		dfs2(i+d[k][0],j+d[k][1]);
}
bool check(int h)
{
	int i,j,cnt=0;
	memset(vis,0,sizeof(vis));
	for(i=1;i<=m;i++)
		if(!vis[1][i])
			dfs(1,i,h);
	for(i=1;i<=n;i++)
		if(!vis[i][1])
			dfs(i,1,h);
	for(i=1;i<=m;i++)
		if(!vis[n][i])
			dfs(n,i,h);
	for(i=1;i<=n;i++)
		if(!vis[i][m])
			dfs(i,m,h);
	memset(vis,0,sizeof(vis));
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			if(!vis[i][j]&&grid[i][j])
			{
				cnt++;
				dfs2(i,j);
			}
	if(cnt<=1)
		return 1;
	else
		return 0;
}
int main()
{
	int ca=0,i,j,maxx=-1,cnt,ans;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		if(n==0&&m==0)
			break;
		cnt=0;
		ans=-1;
		memset(grid,0,sizeof(grid));
		for(i=1;i<=n;i++)
			for(j=1;j<=m;j++)
			{
				scanf("%d",&grid[i][j]);
				maxx=max(maxx,grid[i][j]);
			}
		for(i=1;i<=maxx;i++)
			if(!check(i))
			{
				ans=i;
				break;
			}
		printf("Case %d: ",++ca);
		if(ans==-1)
			printf("Island never splits.\n");
		else
			printf("Island splits when ocean rises %d feet.\n",ans);
	}
	return 0;
}

  

hdu 3329

标签:des   blog   http   io   ar   os   sp   for   java   

原文地址:http://www.cnblogs.com/a972290869/p/4164032.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!