Maze Stretching--HOJ 11879

1、题目类型:迷宫、BFS。

2、解题思路:(1)cin.getline()接收迷宫;(2)BFS搜索其开始位置 'S' 和其结束位置 'E' 并记录两者间的总步数、横向移动步数;(3)根据搜索答案判断其是否满足题意,满足输出结果。

3、注意事项:注意一定存在最短路径、找到符合题意答案即输出。

4、实现方法:

#include<iostream>
#include
<queue>
#include
<string>
using namespace std;

struct Point
{
int x,y;
int step;
int ver;
};

Point S,E;
string map[120];
char ch[120];
double L;
int n,m;
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};

void Init()
{
int i,j;
cin
>>L>>n;
m
=120;
cin.getline(ch,
sizeof(ch));
for(i=0;i<n;i++)
{
map[i]
="";
{
cin.getline(ch,
sizeof(ch));
map[i]
=ch;
if(m>map[i].length())
m
=map[i].length();
}
}
for(i=0;i<n;i++)
{
for(j=0;j<map[i].length();j++)
{
if(map[i][j]=='S')
{
S.x
=i;
S.y
=j;
}
if(map[i][j]=='E')
{
E.x
=i;
E.y
=j;
}
}
}
}

void Solve(int ca)
{
queue
<Point> Q;
int vis[120][120]={0};
int i,x,y,flag=0;
S.ver
=0;
S.step
=0;
Q.push(S);
while(!Q.empty())
{
Point tmp
=Q.front();
Q.pop();

for(i=0;i<4;i++)
{
x
=tmp.x+dir[i][0];
y
=tmp.y+dir[i][1];

if(x>=0 && x<n && y>=0 && y<m && !vis[x][y] && map[x][y]!='#')
{
Point p;
if(map[x][y]=='E')
{
if(i==0||i==2)
p.ver
=tmp.ver+1;
else
p.ver
=tmp.ver;
p.step
=tmp.step+1;
if(L<p.step-p.ver)
continue;
double ans=L-p.step+p.ver;
if(ans>=0)
ans
=ans/p.ver;
else
ans
=(-ans)/p.ver;
ans
*=100;
printf(
"Case #%d: %.3lf%%\n",ca,ans);
return ;
}
p.x
=x;
p.y
=y;
p.step
=tmp.step+1;
if(i==0||i==2)
p.ver
=tmp.ver+1;
else
p.ver
=tmp.ver;
Q.push(p);
vis[x][y]
=1;
}
}
}
}

int main()
{
int i,T;
cin
>>T;
for(i=1;i<=T;i++)
{
Init();
Solve(i);
}
return 0;
}

 

posted @ 2010-09-23 08:18  勇泽  阅读(235)  评论(0编辑  收藏  举报