标签:
| 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