nyoj 58 最小步数(入门bfs)
2016-05-02 19:13
323 查看
水池数目
时间限制:3000 ms | 内存限制:65535 KB难度:4
描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池。
输入第一行输入一个整数N,表示共有N组测试数据
每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个数,表示此处有水还是没水(1表示此处是水池,0表示此处是地面)输出输出该地图中水池的个数。
要注意,每个水池的旁边(上下左右四个位置)如果还是水池的话的话,它们可以看做是同一个水池。
样例输入
2 3 4 1 0 0 0 0 0 1 1 1 1 1 0 5 5 1 1 1 1 0 0 0 1 0 1 0 0 0 0 0 1 1 1 0 0 0 0 1 1 1
样例输出
2 3
题意:最短路径步数,直接bfs
#include <iostream> #include <cstdio> #include <queue> using namespace std; int dir[4][2]={1,0,-1,0,0,1,0,-1}; struct node { int x,y,step; }; int bfs(node s,node t,int map[9][9]) { queue<node> q; //STL定义一个队列q int i; node tmp; q.push(s); while(1) { if(s.x==t.x&&s.y==t.y) return s.step; for(i=0;i<4;i++) { tmp.x=s.x+dir[i][0]; tmp.y=s.y+dir[i][1]; if(map[tmp.x][tmp.y]==0) { tmp.step=s.step+1; map[tmp.x][tmp.y]=1; q.push(tmp); } } s=q.front(); q.pop(); } } int main() { int n; node s,t; scanf("%d",&n); while(n--) { int map[9][9]={1,1,1,1,1,1,1,1,1, 1,0,0,1,0,0,1,0,1, 1,0,0,1,1,0,0,0,1, 1,0,1,0,1,1,0,1,1, 1,0,0,0,0,1,0,0,1, 1,1,0,1,0,1,0,0,1, 1,1,0,1,0,1,0,0,1, 1,1,0,1,0,0,0,0,1, 1,1,1,1,1,1,1,1,1}; scanf("%d%d%d%d",&s.x,&s.y,&t.x,&t.y); s.step=0; map[s.x][s.y]=1; printf("%d\n",bfs(s,t,map)); } return 0; }
相关文章推荐
- Union 联合
- maven打包时使用的pom配置
- PHP递归函数经典算法(斐波那契/阶乘/高斯算法)
- Python第三章-字符串
- 使用mysqladmin ext 了解MySQL运行状态 转
- 《电路基础》电阻|电容|电感公式备忘
- mac上创建docker 是比较的顺利
- JS原型链(补)
- Kafka设计解析(一)- Kafka背景及架构介绍
- Java Collection、Map集合总结
- myeclipse中修改项目的访问路径
- 关系规范化之满足第三范式3NF的函数依赖保持分解算法
- 文件读写
- 网游中的网络编程系列1:UDP vs. TCP
- 安卓佈局摘要
- 数据存储方式及应用沙盒
- 携程2016技术培训生(机票研发部)面经
- web安全字体
- nyoj 水池数目(dfs)
- 完美长方体是不可能存在的 第一章