hdu3329 二分+搜索
2024-10-20 07:58:51
题意:
给你一个岛,然后岛的外侧开始涨水(内侧不涨只有外侧,也就是里面的0永远是0),问最少涨水多少才能把岛分成两个或者两个以上。
思路:
可以二分枚举水的高度(数据不大估计暴力也能过),然后搜索,先把水能覆盖的全都标记上,然后在搜索,看看标记完水之后还有几个岛屿。
#include<stdio.h>
#include<string.h> #define N 111
#define INF 1000000000
int map[N][N];
int mark[N][N];
int dir[4][2] = {0 ,1 ,0 ,-1 ,1 ,0 ,-1 ,0};
int n ,m; int ok (int x ,int y)
{
return x <= n && x >= 1 && y <= m && y >= 1 && !mark[x][y];
} void DFS(int x ,int y ,int now)
{
mark[x][y] = 1;
for(int i = 0 ;i < 4 ;i ++)
{
int xx = x + dir[i][0];
int yy = y + dir[i][1];
if(ok(xx ,yy) && now >= map[xx][yy]) DFS(xx ,yy ,now);
}
} int get_sum(int now)
{
int i ,j ,sum;
memset(mark ,0 ,sizeof(mark));
for(i = 1 ;i <= n ;i ++)
{
if(now >= map[i][1] && !mark[i][1]) DFS(i ,1 ,now);
if(now >= map[i][m] && !mark[i][m]) DFS(i ,m ,now);
}
for(i = 1 ;i <= m ;i ++)
{
if(now >= map[1][i] && !mark[1][i]) DFS(1 ,i ,now);
if(now >= map[n][i] && !mark[n][i]) DFS(n ,i ,now);
} for(sum = 0 ,i = 1 ;i <= n ;i ++)
for(j = 1 ;j <= m ;j ++)
if(!mark[i][j])
{
sum ++;
DFS(i ,j ,INF);
}
return sum;
} int main ()
{
int i ,j ,ans ,cas = 1;
int low ,up ,mid;
while(~scanf("%d %d" ,&n ,&m) && n + m)
{
for(up = -1 ,i = 1 ;i <= n ;i ++)
for(j = 1 ;j <= m ;j ++)
{
scanf("%d" ,&map[i][j]);
if(i == 1 || i == n || j == 1 || j == m)
up = up < map[i][j] ? map[i][j] : up;
}
low = 0 ,ans = -1;
while(low <= up)
{
mid = (low + up) >> 1;
int now = get_sum(mid);
if(now >= 2)
{
ans = mid;
up = mid - 1;
}
else low = mid + 1;
}
printf("Case %d: " ,cas ++);
ans == -1 ? puts("Island never splits.") : printf("Island splits when ocean rises %d feet.\n" ,ans);
}
return 0;
}
最新文章
- MongoDB - basic
- Oracle指定运行变量
- ubuntu忘记密码怎么办
- Google protocol buffer在windows下的编译
- 源码安装extundelete以及对遇到问题的解决
- Js Pattern - Self Define Function
- 组态王6.55WEB全新发布步骤
- http常见的get请求方式和set请求方式。
- JS实现全选,用于界面批量操作向后台传值时使用
- [Python]网络爬虫(四):Opener与Handler的介绍和实例应用
- springmvc4.0配置ajax请求json格式数据
- Python学习笔记1:数据模型和特殊方法(魔术方法)
- Quartz+JAVA+Servlet实现任务调度系统(简洁)
- ROS零门槛学渣教程系列(二)——Linux常用指令:mkdir、tar、 unzip、cp、scp、mv、rm、find、apt、ssh
- MyEclipse 安装插件 Github安装/使用 教程
- 博客维护停止,需要的伙伴们移步http://blog.csdn.net/panhouye
- C#语言正则用法
- mybatis不报错,但是查询结果为0
- [leetcode]Permutations @ Python
- XenServer修改DNS