迷宫的最短路径
2016-03-23 20:51
381 查看
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #define max(a,b) (a)>(b)?(a):(b) #define min(a,b) (a)<(b)?(a):(b) #define ll long long #define ul unsigned long long #define INF 1000000 int N,M; int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1}; char map[105][105]; int d[105][105]; int sx,sy,ex,ey; struct node { int x,y; }q[10005],now,path[105][105]; int bfs() { int head=0,tail=1; q[head].x=sx; q[head].y=sy; d[sx][sy]=0; while(head<tail) { now=q[head++]; if(now.x==ex&&now.y==ey)return d[ex][ey]; for(int i=0;i<4;i++) { int nx=now.x+dx[i]; int ny=now.y+dy[i]; if(nx>=0&&nx<N&&ny>=0&&ny<M&&map[nx][ny]!='#'&&d[nx][ny]==INF) { d[nx][ny]=d[now.x][now.y]+1; path[nx][ny]=now; q[tail].x=nx; q[tail].y=ny; tail++; //printf("%d %d %d\n",nx,ny,d[nx][ny]); } } } return -1; } void outpath(int i,int j) { if(path[i][j].x!=sx||path[i][j].y!=sy) outpath(path[i][j].x,path[i][j].y); printf("%d %d\n",i,j); } void work() { for(int i=0;i<105;i++)for(int j=0;j<105;j++)d[i][j]=INF; scanf("%d%d",&N,&M); for(int i=0;i<N;i++) scanf("%s",map[i]); for(int i=0;i<N;i++) for(int j=0;j<M;j++) { if(map[i][j]=='S') { sx=i; sy=j; } else if(map[i][j]=='G') { ex=i; ey=j; } } int flag=bfs(); if(flag==-1) printf("No way!\n"); else { printf("%d\n",flag); printf("%d %d\n",sx,sy); outpath(ex,ey); } } int main() { work(); return 0; }
相关文章推荐
- Poj 3176 Cow Bowling【dp】
- Android Studio 设置内存大小及原理
- 堆排序
- HDOJ 1728 逃离迷宫(DFS)
- 【5】ARM-根文件系统
- 并查集
- Ubuntu系统下创建python数据挖掘虚拟环境
- Oracle学习之简单查询语句
- Reverse Bits---190
- 求最大公约数
- gson 使用以及打包apk发布的问题
- MySQL与Oracle 差异比较之三函数
- 【4】ARM-内核制作
- C++标准输入流相关
- IOS-Archiver文件归档(2)
- 第三次作业:PSP耗时
- hdu 3974 Assign the task(线段树+将树映射到区间)
- android 开发技巧(10,11)
- PHP异常处理方法
- 常用的监听事件(android)