洪水_codevs3411_bfs
2016-07-19 10:59
267 查看
题目描述 Description
小浣熊松松和朋友到野外露营,没想到遇上了π年一次的大洪水,好在松松是一只爱观察的小浣熊,他发现露营地的地形和洪水有如下性质:①露营地可以被看做是一个N*M的矩形方阵,其中左上角坐标为(1,1),右下角坐标为(n,m),每个格子(i,j)都有一个高度h(i,j)。
②洪水送(r,c)开始,如果一个格子被洪水淹没,那这个格子四周比它低(或相同)的格子也会被淹没。
现在松松想请你帮忙算算,有多少个格子不会被淹没,便于他和朋友逃脱。
[原有误数据已删除]
输入描述 Input Description
第一行包含两个整数n,m,表示矩形方阵右下角坐标。以下n行,每行m个数,第i行第j个数表示格子(i,j)的高度。
最后一行包含两个整数r,c,表示最初被洪水淹没的格子。
输出描述 Output Description
输出仅一行,为永远不会被淹没的格子的数量。数据范围及提示 Data Size & Hint
对于90%的数据,保证随机生成。对于100%的数据,1<=N,M<=1000。
题解
看到洪水、水、可以流动的什么东西就要想到BoyFS了每次搜索高度小于当前点的点,向四周扩展,略像滑雪(其实一点都不像)
之前用数组记录队列中的状态然后MLE了
猛然发现可以用c++自带的queue头文件,就这么用了
内存一直下不来,不知该如何解决
code
/* 作者:olahiuj 题目:p3411 洪水 */ #include <stdio.h> #include <cstring> #include <queue> using namespace std; struct pos { int x,y; }; bool f[1001][1001]; int map[1001][1001]; int dx[4]={-1,1,0,0}; int dy[4]={0,0,-1,1}; queue<pos>s; pos st; int n,m; int main() { memset(map,0,sizeof(map)); memset(f,false,sizeof(f)); scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) scanf("%d",&map[i][j]); scanf("%d%d",&st.x,&st.y); s.push(st); f[st.x][st.y]=true; pos v; while (s.size()) { pos now=s.front(); int t=map[now.x][now.y]; for (int i=0;i<4;i++) { int x=now.x+dx[i]; int y=now.y+dy[i]; if (x<=n&&x>0&&y<=m&&y>0&&map[x][y]<=t&&!f[x][y]) { v.x=x; v.y=y; f[x][y]=true; s.push(v); } } s.pop(); } int ans=0; for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) if (!f[i][j]) ans++; printf("%d\n",ans); return 0; }
相关文章推荐
- Context上下文对象(抄书的)
- 解决VMware下centOS 7无法访问网络的问题经过
- CodeForces 166E Tetrahedron
- android studio 将library导出为jar 亲测成功
- 查看MySQL的当前最大连接数
- 详谈JS中实现种子随机数及作用
- 数据库知识
- iOS标准时间与时间戳相互转换
- Android AsyncTask详细介绍
- RedHat6.x伪分布安装Greenplum
- git常用命令
- 1183: 平面点排序(一)(结构体专题)
- Linux+C(一)
- jQuery中.bind() .live() .delegate() .on()的区别
- 拆分单元格快速复制内容
- 矩阵乘法
- Java中使用Collections.sort()方法对数字和字符串泛型的LIst进行排序
- gridview点击出现背景色
- Android studio下的DNK开发JNI详解流程
- 清除jquery validation插件的上一次错误提示消息