标签:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 10975 | Accepted: 4731 |
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的步数
再输出右转优先时,从S到E的步数
最后输出S到E的最短步数
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<iostream> #include<algorithm> using namespace std; char map[1001][1101]; int pxy[4][2]= {{0,-1},{1,0},{0,1},{-1,0}}; int qxy[4][2]= {{0,1},{1,0},{0,-1},{-1,0}}; int n,m; int a,b,aa,bb; int ans; int anss; struct node { int x,y,z; }q[5000010]; int v[1001][1001]; int jx[] = {0,1,0,-1}; int jy[] = {1,0,-1,0}; int DFS1(int x,int y,int count) { if(x == aa && y == bb) { return count+1; } if(x<0 || x >=n || y<0 || y>=m || map[x][y] == '#') { return 0; } int temp = 0; anss = (anss + 3) % 4; while(1) { temp = DFS1(x+pxy[anss][0],y+pxy[anss][1],count+1); if(temp>0) { break; } anss = (anss + 1) % 4; } return temp; } int DFS2(int x,int y,int count) { if(x == aa && y == bb) { return count+1; } if(x<0 || x>=n || y<0 || y>=m || map[x][y] == '#') { return 0; } int tempp = 0; ans = (ans + 3) % 4; while(1) { tempp = DFS2(x+qxy[ans][0],y+qxy[ans][1],count+1); if(tempp > 0) { break; } ans = (ans + 1) % 4; } return tempp; } int BFS(int x,int y) { int s = 0,e = 0; struct node t,f; memset(q,0,sizeof(q)); memset(v,0,sizeof(v)); t.x = x; t.y = y; t.z = 0; q[e++] = t; v[t.x][t.y] = 1; while(s < e) { t = q[s++]; if(t.x == aa && t.y == bb) { return t.z+1; } for(int i=0;i<4;i++) { f.x = t.x + jx[i]; f.y = t.y + jy[i]; if(f.x>=0 && f.x<n && f.y>=0 && f.y<m &&v[f.x][f.y] == 0 && map[f.x][f.y]!='#') { f.z = t.z + 1; q[e++] = f; v[f.x][f.y] = 1; } } } return 0; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&m,&n); for(int i=0;i<n;i++) { scanf("%s",map[i]); for(int j=0;j<m;j++) { if(map[i][j] == 'S') { a = i; b = j; } else if(map[i][j] == 'E') { aa = i; bb = j; } } } anss = 0; int nn = DFS1(a,b,0); ans = 0; int mm = DFS2(a,b,0); int pp = BFS(a,b); printf("%d %d %d\n",mm,nn,pp); } return 0; }
版权声明:本文为博主原创文章,如有特殊需要请与博主联系 QQ : 793977586。
POJ 3083 Children of the Candy Corn(搜索)
标签:
原文地址:http://blog.csdn.net/yeguxin/article/details/47101349