哈理工oj:从前的宝藏(2270)
Description
从前有一个藏宝图,“s”代表起点,“t”代表终点,“#”代表墙(墙不可以通过),“”代表传送门(传送门之间可以直接到达),“*”代表空地。可不可以从起点到达终点,如果能输出“YES”,否则输出“NO”。
Input
输入数据有多组。
每组数据第一行输入n, m带表地图的行数和列数(2 ≤ n + m ≤ 100)。
接下来n行每行输出m个字母表示每个点的情况。
数据保证:
1. 保证地图上只有’s’, ‘t’, ‘#’, ‘’, ‘*’。
2. 保证起点和终点有且只有一个。
Output
每组数据的输出有一行,如果能到达终点输出“YES”,否则输出“NO”。
Sample Input
1 2
st
5 5
s****
$
#
$
****t
5 5
s****
#
****t
Sample Output
YES
YES
NO
简单广搜;
只要注意每次用完队列后都要清空;
还有在寻找完每个传送点后都要判断其之前是否走过
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<queue>
#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
int xx[]={1,-1,0,0};
int yy[]={0,0,1,-1};
int n,m;
char maps[105][105];
int ma[105][105];
int flag=0;
int judge(int x,int y)
{
if(x>=0&&x<n&&y>=0&&y<m&&ma[x][y]==0&&maps[x][y]!='#') return 1;
else return 0;
}
struct node
{
int x,y;
};
int bfs(int x,int y)
{
queue<node>Q;
memset(ma,0,sizeof(ma));
node st;
st.x=x;
st.y=y;
Q.push(st);
while(!Q.empty())
{
node f,s;
f=Q.front();
if(maps[f.x][f.y]=='t')
{
return 1;
}
Q.pop();
for(int i=0;i<4;i++)
{
s.x=f.x+xx[i];
s.y=f.y+yy[i];
if(judge(s.x,s.y))
{
ma[s.x][s.y]=1;
Q.push(s);
if(maps[s.x][s.y]=='$')
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(maps[i][j]=='$'&&!ma[i][j])
{
ma[i][j]=1;
s.x=i;
s.y=j;
Q.push(s);
}
}
}
}
}
}
}
return -1;
}
int main()
{
while(scanf("%d%d",&n,&m)==2)
{
memset(maps,0,sizeof(maps));
// memset(maps,0,sizeof(maps));
//memset(ma,0,sizeof(ma));
int sx,sy;
for(int i=0;i<n;i++)
{
scanf("%s",&maps[i]);
for(int j=0;j<m;j++)
{
if(maps[i][j]=='s')
{
sx=i;
sy=j;
}
}
}
ma[sx][sy]=1;
if(bfs(sx,sy)==-1) printf("NO\n");
else printf("YES\n");
}
}