#include<stdio.h>
#include<queue>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
#define MAXN 310
#define INF 0x3f3f3f3f
int dx[4]= {0,0,1,-1};
int dy[4]= {1,-1,0,0};
struct node
{
int x,y;
int step;//标记步子
friend bool operator<(node s1,node s2)
{
return s1.step>s2.step;
}
} p,temp;//结构体优先队列
int n,m,vis[MAXN][MAXN],sx,sy,ans;//sx,sy分别标记起点坐标的横纵坐标
char map[MAXN][MAXN];//标记地图
bool judge(node s)
{
if(s.x<0||s.x>=n||s.y<0||s.y>=m)//判断是否越界
return true;
if(map[s.x][s.y]=='R'||map[s.x][s.y]=='S'||vis[s.x][s.y])//判断是否能走
return true;
return false;
}
void bfs()
{
priority_queue<node>q;
memset(vis,0,sizeof(vis));
p.x=sx;
p.y=sy;
p.step=0;
vis[sx][sy]=1;
q.push(p);
while(!q.empty())
{
p=q.top();
q.pop();
if(map[p.x][p.y]=='T')//判断是否到达终点
{
ans=p.step;
return ;
}
for(int i=0; i<4; i++)//四个方向的查询
{
temp.x=p.x+dx[i];
temp.y=p.y+dy[i];
if(judge(temp))//判断是否可以走
continue;
if(map[temp.x][temp.y]=='B')//相对题来说,遇到不同的情况,步子是不同的
{
temp.step=p.step+2;
}
else
{
temp.step=p.step+1;//相对题来说,遇到不同的情况,步子是不同的
}
vis[temp.x][temp.y]=1;//走过了标记为1
q.push(temp);
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)
return 0;
for(int i=0; i<n; i++)
{
scanf("%s",map[i]);
for(int j=0; j<m; j++)
{
if(map[i][j]=='Y')
{
sx=i;
sy=j;
}
}
}
ans=INF;
bfs();
if(ans!=INF)
printf("%d\n",ans);
else
printf("-1\n");
}
#include<queue>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
#define MAXN 310
#define INF 0x3f3f3f3f
int dx[4]= {0,0,1,-1};
int dy[4]= {1,-1,0,0};
struct node
{
int x,y;
int step;//标记步子
friend bool operator<(node s1,node s2)
{
return s1.step>s2.step;
}
} p,temp;//结构体优先队列
int n,m,vis[MAXN][MAXN],sx,sy,ans;//sx,sy分别标记起点坐标的横纵坐标
char map[MAXN][MAXN];//标记地图
bool judge(node s)
{
if(s.x<0||s.x>=n||s.y<0||s.y>=m)//判断是否越界
return true;
if(map[s.x][s.y]=='R'||map[s.x][s.y]=='S'||vis[s.x][s.y])//判断是否能走
return true;
return false;
}
void bfs()
{
priority_queue<node>q;
memset(vis,0,sizeof(vis));
p.x=sx;
p.y=sy;
p.step=0;
vis[sx][sy]=1;
q.push(p);
while(!q.empty())
{
p=q.top();
q.pop();
if(map[p.x][p.y]=='T')//判断是否到达终点
{
ans=p.step;
return ;
}
for(int i=0; i<4; i++)//四个方向的查询
{
temp.x=p.x+dx[i];
temp.y=p.y+dy[i];
if(judge(temp))//判断是否可以走
continue;
if(map[temp.x][temp.y]=='B')//相对题来说,遇到不同的情况,步子是不同的
{
temp.step=p.step+2;
}
else
{
temp.step=p.step+1;//相对题来说,遇到不同的情况,步子是不同的
}
vis[temp.x][temp.y]=1;//走过了标记为1
q.push(temp);
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)
return 0;
for(int i=0; i<n; i++)
{
scanf("%s",map[i]);
for(int j=0; j<m; j++)
{
if(map[i][j]=='Y')
{
sx=i;
sy=j;
}
}
}
ans=INF;
bfs();
if(ans!=INF)
printf("%d\n",ans);
else
printf("-1\n");
}
}
相关题 nyoj248 poj2431