题意:

      给你一个岛,然后岛的外侧开始涨水(内侧不涨只有外侧,也就是里面的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;
}

最新文章

  1. MongoDB - basic
  2. Oracle指定运行变量
  3. ubuntu忘记密码怎么办
  4. Google protocol buffer在windows下的编译
  5. 源码安装extundelete以及对遇到问题的解决
  6. Js Pattern - Self Define Function
  7. 组态王6.55WEB全新发布步骤
  8. http常见的get请求方式和set请求方式。
  9. JS实现全选,用于界面批量操作向后台传值时使用
  10. [Python]网络爬虫(四):Opener与Handler的介绍和实例应用
  11. springmvc4.0配置ajax请求json格式数据
  12. Python学习笔记1:数据模型和特殊方法(魔术方法)
  13. Quartz+JAVA+Servlet实现任务调度系统(简洁)
  14. ROS零门槛学渣教程系列(二)——Linux常用指令:mkdir、tar、 unzip、cp、scp、mv、rm、find、apt、ssh
  15. MyEclipse 安装插件 Github安装/使用 教程
  16. 博客维护停止,需要的伙伴们移步http://blog.csdn.net/panhouye
  17. C#语言正则用法
  18. mybatis不报错,但是查询结果为0
  19. [leetcode]Permutations @ Python
  20. XenServer修改DNS

热门文章

  1. 详解JavaScript中的原型
  2. ReactElement源码笔记
  3. java基础知识 + 常见面试题
  4. CCF(元素选择器:50分):字符串+模拟
  5. .NET并发编程-反应式编程
  6. unittest系列(三)unittest用例如何执行
  7. HYSBZ 1734 二分
  8. 在Windows10搭建WebAssembly开发环境
  9. 得分(JAVA语言)
  10. 8、MyBatis之使用注解开发