宝岛探险
2016-03-12 16:26
302 查看
解题思路:其实题目的本质就是从(6,8)开始的广度优先搜索bfs,每次需要向上下左右四个方向扩展,当扩展的点大于0的时候就加入队列,知道队列扩展完毕。所有被加入到队列的点的总数就是小岛的面积
#include<iostream> using namespace std; struct note { int x;//横坐标 int y;//纵坐标 }; struct note que[2051]; int i,j,k,n,m,startx,starty,ty,tx,count=0; int a[51][51],book[51][51]; int next[4][2]={{0,1}, {1,0}, {0,-1}, {-1,0}}; void bfs() { //队列初始化 int head=1; int tail=1; //往队列插入迷宫的入口坐标 que[tail].x=startx; que[tail].y=starty; tail++; book[startx][starty]=1; count++; while(head<tail)//当队列不为空时候 { //枚举四个方向(注意方向数组的设置和for循环的遍历,通用模板) for(k=0;k<=3;k++) { //计算下一个点坐标 tx=que[head].x+next[k][0]; ty=que[head].y+next[k][1]; //判断是否越界 if(tx<1||tx>n||ty<1||ty>m) continue; //判断是否是障碍物或者已经在路径中 if(a[tx][ty]>0&&book[tx][ty]==0) { count++; //把这个点标记为已经走过 //注意宽带搜索每个点只能入队列一次 ,和dfs不同,所以book的值不需要恢复为0; book[tx][ty]=1; //插入新的点到队列中 que[tail].x =tx; que[tail].y=ty; tail++; } } head++;//这个地方千万不能忘记,当一个点扩展结束后,head++才能使得后面的点再进行扩展 } //打印队列中末尾最后一个点的步数 //注意tail是指向队尾的下一个位置,所以需要-1 } int main() { cin>>n>>m>>startx>>starty; for(i=1;i<=n;i++) for(j=1;j<=m;j++) cin>>a[i][j]; bfs(); cout<<count<<endl; return 0; }
相关文章推荐
- poj 1047多个大数相加
- Codeforces Round #269 (Div. 2)(D. MUH and Cube Walls(KMP))
- 本周实验的PSP0过程文档
- 果园里的树
- Iptalbes练习题(一)
- 九度OJ1172:哈夫曼树
- Static 变量引发的NullPointerException
- Physics.Raycast和Ray(射线)的理解
- 增加bluestacks的存储空间- 4G
- 20135323符运锦----第三周:构建一个简单的Linux系统MenuOS
- 关于软件工程文档解析
- 软件工程第二周学习进度表
- hdu Dragon Balls 3635【并查集】
- HDU 1203 I NEED A OFFER!
- 实时SLAM的未来及与深度学习的比较The Future of Real-Time SLAM and “Deep Learning vs SLAM”
- Android 混淆代码总结
- react.js-10-渐隐动画
- MySQL - Entity : The value for column 'IsPrimaryKey' in table 'TableDetails' is DBNull
- 流式大数据处理的三种框架:Storm,Spark和Samza
- HDFS源码分析DataXceiver之读数据块