HDU1728---逃离迷宫
2015-06-11 20:04
417 查看
#include<stdio.h> #include<string.h> #include<iostream> #include<queue> using namespace std; #define inf 0xffffff int n,m; int k,ex,ey,sx,sy; bool flag; char maze[110][110]; int dir[4][2]={-1,0,1,0,0,1,0,-1}; int wan[110][110]; struct node{int x,y;}; queue<node>q; void bfs(){ for(int i=0;i<m;i++) for(int j=0;j<n;j++) wan[i][j]=inf; node ft,tp; ft.x=sx,ft.y=sy; wan[ft.x][ft.y]=-1; while(!q.empty()) q.pop(); q.push(ft); while(!q.empty()){ ft=q.front(); q.pop(); if(ft.x==ex&&ft.y==ey&&wan[ft.x][ft.y]<=k){ puts("yes"); return ; } for(int i=0;i<4;i++){ tp.x=ft.x+dir[i][0]; tp.y=ft.y+dir[i][1]; while(tp.x>=0&&tp.x<m&&tp.y>=0&&tp.y<n) { if(maze[tp.x][tp.y]=='*') break; if(wan[tp.x][tp.y]<wan[ft.x][ft.y]+1)//因为最开始初始状态为-1,如果现在的转弯次数比ft时小,说明有其他的路径,这里作为维护作用使用 break; wan[tp.x][tp.y]=wan[ft.x][ft.y]+1; if(wan[tp.x][tp.y]>k) break; if(wan[tp.x][tp.y]==k&&tp.x != ex && tp.y != ey) break; q.push(tp); tp.x+=dir[i][0]; tp.y+=dir[i][1];//一条道搜索到底 } } } puts("no"); } int main() { int t ; scanf("%d",&t); while(t--){ scanf("%d%d",&m,&n); for(int i=0;i<m;i++)//注意m,n顺序 scanf("%s",&maze[i]); scanf("%d%d%d%d%d",&k,&sy,&sx,&ey,&ex);//坐标顺序 sx--,sy--,ex--,ey--; bfs(); } return 0; }
相关文章推荐
- ios第一天
- poj 1655 树形dp
- GIS空间分析 对栅格数据分析,距离分析,点位置查找
- Java知多少(89)列表和组合框
- 对JDBC的一些理解
- 黑马程序员——java基础——集合框架(一:单列集合(Collection体系))
- 线程同步:信号量
- x210v3开发板u-boot-2012.10移植之十---串口摇身一变控制台
- 已下是转载如有冒犯,请见谅
- mongodb.core.query.Criteria 查询非空(ne)和排序(sort)
- 局域网雨云蠕虫病毒的处理
- OOAD 学习笔记 九
- poj 1269 Intersecting Lines
- Laravel控制器调用model的两种方法
- hdu 4296 Buildings(贪婪)
- spring中常用的注解
- spring无法获取jar包中的xml配置
- [LeetCode]Max Points on a Line
- System.exit()方法的作用
- hdu 3631 Shortest Path(Floyd)