标签:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 11215 | Accepted: 4841 |
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,如果一直按照走左边的路(碰到墙后返回来继续),或一直选择向右走,各自需要多少步;和求最短路(简单BFS)
这道题虽说是一道题,却同时考察了DFS和BFS
当然,这道题的困难之处不在于DFS有多复杂,而在于如何一直向左走或向右走却不受位置的影响,解决办法是设置两个数组顺时针与逆时针,方法如下:
设左上右下为 0, 1, 2, 3 顺时针时,假设当前的前进方向为d, 那么从(d+2)%4,也就是相反方向开始循环,每次 (d+1)%4,遇到第一个能走的就前进。 逆时针时同理,不同的是每次(d-1+4)%4。
下面附上本人比较挫代码
#include<stdio.h> #include<string.h> #include<queue> #include<iostream> #include<algorithm> using namespace std; const int maxn=100; char str[maxn][maxn]; bool vis[maxn][maxn]; int stepl=0,stepr=0,stepm=0; int n,m; int sx,sy,sd; int dirl[4][2]={-1,0,0,1,1,0,0,-1}; int dirr[4][2]={1,0,0,1,-1,0,0,-1}; struct node{ int x,y,dis; }; node u,v; int step; int dfs(int x,int y,int dir,int a[][2]){ if(str[x][y]==‘E‘) return 1;//特别注意,返回1 for(int i=0;i<4;i++){ int tdir=(dir+i+3)%4;//tdir需要重新定义 int tx=x+a[tdir][0]; int ty=y+a[tdir][1]; if(tx>=0&&tx<n&&ty>=0&&ty<m&&str[tx][ty]!=‘#‘&&!vis[tx][ty]){ step =dfs(tx,ty,tdir,a)+1;//+1 break; } } return step; } int bfs(){ memset(vis,false,sizeof(vis)); u.x=sx,u.y=sy,u.dis=1; vis[sx][sy]=true; queue<node>q; q.push(u); while(!q.empty()){ u=q.front(); q.pop(); if(str[u.x][u.y]==‘E‘) return u.dis; for(int i=0;i<4;i++){ v.x=u.x+dirl[i][0]; v.y=u.y+dirl[i][1]; if(v.x>=0&&v.x<n&&v.y>=0&&v.y<m&& !vis[v.x][v.y]&&str[v.x][v.y]!=‘#‘){ vis[v.x][v.y]=true; v.dis=u.dis+1; q.push(v); } } } } int main(){ int t; scanf("%d",&t); while(t--){ memset(str,0,sizeof(str)); memset(vis,false,sizeof(vis)); scanf("%d%d",&m,&n); for(int i=0;i<n;i++){ scanf("%s",str[i]); for(int j=0;j<m;j++){ if(str[i][j]==‘S‘) sx=i,sy=j; } } int tx,ty; for(int i=0;i<4;i++){//判断左走方向 tx=sx+dirl[i][0]; ty=sy+dirl[i][1]; if(str[tx][ty]==‘.‘){ sd=i; break; } } step=0;//每次向左或向右需要重新赋值为9 stepl=dfs(sx,sy,sd,dirl);//对于左走进行dfs for(int i=0;i<4;i++){//判断左走方向 tx=sx+dirr[i][0]; ty=sy+dirr[i][1]; if(str[tx][ty]==‘.‘){ sd=i; break; } } step=0; stepr=dfs(sx,sy,sd,dirr);//对于左走进行dfs stepm=bfs();//最短路进行bfs printf("%d %d %d\n",stepl,stepr,stepm); } return 0; }
poj3083 Children of the Candy Corn BFS&&DFS
标签:
原文地址:http://www.cnblogs.com/13224ACMer/p/4738526.html