Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 10881 | Accepted: 4678 |
Description
Input
Output
Sample Input
2 8 8 ######## #......# #.####.# #.####.# #.####.# #.####.# #...#..# #S#E#### 9 5 ######### #.#.#.#.# S.......E #.#.#.#.# #########
Sample Output
37 5 5 17 17 9
Source
题目链接:一个迷宫,S为起点,E为终点。
三种方法从S到E:1.从前进方向的左侧开始顺时针寻找下一个可行点;
2.从前进方向的右侧开始逆时针寻找下一个可行点;
3.找最短路径;
求分别通过这三种方法走过的格子数。
解题思路:前两种方法用DFS,四个方向,若是方法一,下一个点不可行时,顺时针判断下一个点,可行时,逆时针回到上一个方向。即nextdex=(dex+1)%4和nextdex=(dex+3)%4,方法二直接两个式子位置互换。找最短路显然用BFS,要注意visit数组的标记!!当时忘了TLE了好久。
代码如下:
#include <cstdio> #include <queue> #include <cstring> using namespace std; int dx[4]={-1,0,1,0}; int dy[4]={0,-1,0,1}; char a[42][42]; int vis[42][42]; int n,m,cnt; bool p; struct node //每个格子的信息,num是起点到当前格子的步数 { int x,y,num; }; void dfsl(int x,int y,int i) //左转优先 { if(p||a[x][y]=='E') { p=true; return ; } int cx=x+dx[i]; int cy=y+dy[i]; while(cx<0||cx>=n||cy<0||cy>=m||a[cx][cy]=='#')//下一个点不可行 { i=(i+3)%4; //顺时针转判断下一个点 cx=x+dx[i]; cy=y+dy[i]; } cnt++; dfsl(cx,cy,(i+1)%4); //下一个点可行,方向逆时针回到上一个方向 } void dfsr(int x,int y,int i) //右转优先,和左转优先正好相反 { if(p||a[x][y]=='E') { p=true; return ; } int cx=x+dx[i]; int cy=y+dy[i]; while(cx<0||cx>=n||cy<0||cy>=m||a[cx][cy]=='#') { i=(i+1)%4; cx=x+dx[i]; cy=y+dy[i]; } cnt++; dfsr(cx,cy,(i+3)%4); } int bfs(int sx,int sy) //找最短路径 { queue<node>q; node sd; sd.x=sx; sd.y=sy; sd.num=1; q.push(sd); vis[sx][sy]=1; //起点也要标记 while(!q.empty()) { node no=q.front(); q.pop(); for(int i=0;i<4;i++)//每个方向都要判断 { int cx=no.x+dx[i]; int cy=no.y+dy[i]; if(vis[cx][cy]||cx<0||cx>=n||cy<0||cy>=m||a[cx][cy]=='#') continue; //下一个点不可行,换一个方向 sd.x=cx; //下一个点可行,步数加以后加入队列 sd.y=cy; sd.num=no.num+1; vis[cx][cy]=1; if(a[cx][cy]=='E') return sd.num; q.push(sd); } } } int main() { int t,sx,sy; scanf("%d",&t); while(t--) { memset(vis,0,sizeof(vis)); scanf("%d%d",&m,&n); for(int i=0;i<n;i++) { scanf("%s",&a[i]); for(int j=0;j<m;j++) { if(a[i][j]=='S') { sx=i; sy=j; } } } cnt=1,p=false; dfsl(sx,sy,0); printf("%d ",cnt); cnt=1,p=false; dfsr(sx,sy,0); printf("%d ",cnt); printf("%d\n",bfs(sx,sy)); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
poj 3083 Children of the Candy Corn (DFS+BFS)
原文地址:http://blog.csdn.net/criminalcode/article/details/46811119