基础BFS+DFS poj3083
2016-05-29 13:08
344 查看
//满基础的一道题
//最短路径肯定是BFS。
//然后靠右,靠左,就DFS啦
//根据前一个状态推出下一个状态,举靠左的例子,如果一开始是上的话,那么他的接下来依次就是 左,上 , 右 , 下
//如果我们用数组存一下 左,上 , 右 , 下,
//而且你会发现他原来的状态是d,下一个状态就是=((d-1+4)%4+i)%4,其实你比划一下,就会知道左的话就是下开始变,上的话就是左开始变。
//同比靠右也是一样
//初始化,题目条件是
//they will always be located along one of the maze edges and never in a corner
//所以开始搞一下状态就好了
//最短路径肯定是BFS。
//然后靠右,靠左,就DFS啦
//根据前一个状态推出下一个状态,举靠左的例子,如果一开始是上的话,那么他的接下来依次就是 左,上 , 右 , 下
//如果我们用数组存一下 左,上 , 右 , 下,
//而且你会发现他原来的状态是d,下一个状态就是=((d-1+4)%4+i)%4,其实你比划一下,就会知道左的话就是下开始变,上的话就是左开始变。
//同比靠右也是一样
//初始化,题目条件是
//they will always be located along one of the maze edges and never in a corner
//所以开始搞一下状态就好了
#include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> #include <iostream> using namespace std; #define LL __int64 #define N 50 char ma ; bool vis ; int n,m; int bx,by; int ex,ey; int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; int dl[][2]={{0,-1},{-1,0},{0,1},{1,0}}; int dr[][2]={{0,1},{-1,0},{0,-1},{1,0}}; struct asd{ int x,y; int step; }; asd q[1000010]; int head,tail; int ans1,ans2,ans3; int BFS() { head=0;tail=1; q[head].x=bx; q[head].y=by; q[head].step=0; memset(vis,0,sizeof(vis)); while(head<tail) { int a=q[head].x; int b=q[head].y; if(a==ex&&b==ey) return q[head].step; for(int i=0;i<4;i++) { int aa=a+dx[i]; int bb=b+dy[i]; if(aa<0||bb<0||aa>=n||bb>=m||vis[aa][bb]||ma[aa][bb]=='#') continue; vis[aa][bb]=1; q[tail].x=aa; q[tail].y=bb; q[tail].step=q[head].step+1; tail++; } head++; } } int flag; int dfs(int x,int y,int d,int step,int dir[][2]) { for(int i=0;i<4;i++) { int j=((d-1+4)%4+i)%4; int aa=x+dir[j][0]; int bb=y+dir[j][1]; if(aa<0||bb<0||aa>=n||bb>=m||ma[aa][bb]=='#') continue; if(aa==ex&&bb==ey) { return step+1; } return dfs(aa,bb,j,step+1,dir); } } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&m,&n); for(int i=0;i<n;i++) scanf("%s",ma[i]); int f1,f2; f1=f2=0; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(ma[i][j]=='S') { bx=i;by=j; f1=1; } if(ma[i][j]=='E') { ex=i;ey=j; f2=1; } if(f1&&f2) break; } if(f1&&f2) break; } int d1,d2; if(bx == 0){ d1 = 3; d2 = 3; } else if(bx == n-1){ d1 = 1; d2 = 1; } else if(by == 0){ d1 = 2; d2 = 0; } else if(by == m-1){ d1 = 0; d2 = 2; } ans1=dfs(bx,by,d1,1,dl); ans2=dfs(bx,by,d2,1,dr); ans3=BFS(); printf("%d ",ans1); printf("%d ",ans2); printf("%d\n",ans3+1); } }
相关文章推荐
- ubuntu系统 /etc目录下配置文件的作用
- 【编程马拉松】【005-猴子分桃】
- IIPP迷你项目(一)“Rock-paper-scissor-lizard-Spock”
- Dynamo 译文 Dynamo: Amazon's Highly Available Key-value Store
- 使用ScrollView实现滚动效果
- Java - PAT - 1013. 数素数 (20) 注意超时
- java 开发linux常用命令
- git 简单教程更新
- Redis源码解析:21sentinel(二)定期发送消息、检测主观下线
- SpringMVC学习笔记(3):绑定数据(1)
- 矩阵链乘法
- IntelliJ IDEA 2016.1.1 远程调试tomcat
- MySQL学习15:子查询(一)
- Java开发工具简介
- 360浏览器无法打开Internet选项
- 程序员应该关注的一些事儿
- UVA - 1374 - Power Calculus(迭代加深)
- SQL语言入门
- 面试的65个回答技巧-适用于BAT公司
- java入门之GC的算法与种类(4)