帅气的HYC迷路了
发布时间: 2015年11月1日 17:02 最后更新: 2015年11月1日 18:40 时间限制: 1000ms 内存限制: 128M
有一天, 我们帅气的HYC找到了一张藏宝图, 这张图很神奇, 只要你看它一眼, 立马就会被传送到一个迷宫里, 这个迷宫仅有一个出口.那么现在问题来啦, 问你找到这个出口需要走多少步?
现在给出HYC在迷宫房中走的规则, HYC每走出一步, 都会优先向左走, 如果左边是墙, 那么他会向前走, 如果前边也是墙, 那么他就会向右走, 如果右边也是墙, 那么他只能选择后退了~~~~>_<~~~~
另外, HYC也想知道如果不这样走, 他最少能走多少步能走出出口呢?
首先给出一个T (1 <= T < 100) 代表T组测试数据 每组测试数据第一行为两个整数r 和 c (3 <= r,c <= 40) r代表这个迷宫有多少列,c代表这个迷宫有多少行. S表示入口, E表示出口, #表示墙不能走, .表示空白区域, 可以走. 题目保证给出的迷宫四周都是墙, 而且按照规则走总能找到出口, 且初始方向为向北走,快来帮帮他吧!
每组数据输出两个数, 第一个数表示按照规则走的步数, 第二个数表示走到出口最短需要多少步.
复制
1 9 5 ######### #.#.#.#.# S.......E #.#.#.#.# #########
17 9
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
char map[50][50];
int book[50][50],n,m,flog;
int go[4][2]={0,1,-1,0,0,-1,1,0};
struct node
{
int x,y;
int time;
}re,pe;
int check(node r)
{
if(r.x<0||r.x>=n||r.y<0||r.y>=m||map[r.x][r.y]=='#')
return 1;
return 0;
}
int bfs(int x,int y)
{
queue<node> q;
memset(book,0,sizeof(book));
re.x=x;
re.y=y;
re.time=0;
q.push(re);
book[x][y]=1;
while(!q.empty())
{
pe=q.front();
q.pop();
for(int i=0;i<4;i++)
{
//printf("haha\n");
re=pe;
re.x+=go[i][0];
re.y+=go[i][1];
re.time++;
if(check(re))
{
continue;
}
if(book[re.x][re.y])
continue;
if(map[re.x][re.y]=='E')
{
printf("%d",re.time+1);
return 0;
}
book[re.x][re.y]=1;
// printf("%d %d %d\n",re.x,re.y,re.time);
q.push(re);
}
}
}
int dfs(node p,int fang)
{
int i,j;
node q;
// printf("%d %d %d\n",p.x,p.y,p.time);
if(map[p.x][p.y]=='E'||flog)
{
flog=1;
printf("%d",p.time+1);
return 0;
}
for(i=0;i<4;i++)
{
if(i==0)
j=(fang+1)%4;
else if(i==1)
j=fang;
else if(i==2)
j=(fang+3)%4;
else
j=(fang+2)%4;
q=p;
q.x+=go[j][0];
q.y+=go[j][1];
q.time++;
if(check(q))
continue;
else
break;
}
dfs(q,j);
return 0;
}
int main()
{
int t,i,j;
node s;
scanf("%d",&t);
while(t--)
{
flog=0;
scanf("%d %d",&m,&n);
getchar();
for(i=0;i<n;i++)
scanf("%s",map[i]);
// for(i=0;i<n;i++)
// {
// for(j=0;j<m;j++)
// printf("%c",map[i][j]);
// printf("\n");
// }
for(i=0;i<n;i++)
for(j=0;j<m;j++)
if(map[i][j]=='S')
{
//dfs(i,j);
s.x=i;
s.y=j;
s.time=0;
dfs(s,1);
printf(" ");//printf("haha\n");
bfs(i,j);
printf("\n");
}
}
return 0;
}