从前的宝藏 | ||||||
| ||||||
Description | ||||||
从前有一个藏宝图,“s”代表起点,“t”代表终点,“#”代表墙(墙不可以通过),“$”代表传送门(传送门之间可以直接到达),“*”代表空地。可不可以从起点到达终点,如果能输出“YES”,否则输出“NO”。 | ||||||
Input | ||||||
输入数据有多组。 | ||||||
Output | ||||||
每组数据的输出有一行,如果能到达终点输出“YES”,否则输出“NO”。 | ||||||
Sample Input | ||||||
1 2 | ||||||
Sample Output | ||||||
YES |
深搜广搜都可以
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define ll long long int
#define N 105
int n,m,xx,yy;///定义地图长宽和一个记录终点坐标的变量
char mp[N][N];
int dir[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};///定义上下左右四个方向
int flag[N][N];///用来判断是否走过
int ff(int i,int j)///第三步
{
int dx,dy,x;
for(x=0; x<4; x++)
{
dx=i+dir[x][0];
dy=j+dir[x][1];
if(dx>=0&&dx<n&&dy>=0&&dy<m)///同理,在终点开始搜索传送门
{
if(mp[dx][dy]=='*'&&flag[dx][dy]!=1)
{
flag[dx][dy]=1;
ff(dx,dy);
}
else if(mp[dx][dy]=='$')
{
flag[xx][yy]=1;
break;
}
else continue;
}
}
}
int DFS(int i,int j)///第二步
{
int dx,dy,x;
for(x=0; x<4; x++)
{
dx=i+dir[x][0];///将起点坐标带入,然后运用递归上下左右走
dy=j+dir[x][1];
if(dx>=0&&dx<n&&dy>=0&&dy<m)///如果没超出边界
{
if(mp[dx][dy]=='*'&&flag[dx][dy]!=1)///如果是路,更新你现在的坐标,在这个基础上继续上下左右走,并将你走过的点标记
{
flag[dx][dy]=1;
DFS(dx,dy);
}
else if(mp[dx][dy]=='t')///如果到达终点,把终点标记为一,一会判断1,0就好
{
flag[dx][dy]=1;
}
else if(mp[dx][dy]=='$')///如果搜到传送门,从终点那头也寻找传送门
{
ff(xx,yy);
}
else continue;
}
}
}
int main()///第一步
{
while(cin>>n>>m)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
cin>>mp[i][j];
if(mp[i][j]=='t')
{
xx=i,yy=j;///输入地图,然后记录下终点坐标
}
}
}
memset(flag,0,sizeof(flag));///将flag数组清零
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
if(mp[i][j]=='s')///搜到起点,开始搜索;
DFS(i,j);
}
}
if(flag[xx][yy]==1)///如果终点被标记为一,输出yes
{
cout<<"YES"<<endl;
}
else cout<<"NO"<<endl;
}
}
#include <string.h>
#include <algorithm>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define ll long long int
#define N 105
int n,m,xx,yy;///定义地图长宽和一个记录终点坐标的变量
char mp[N][N];
int dir[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};///定义上下左右四个方向
int flag[N][N];///用来判断是否走过
int ff(int i,int j)///第三步
{
int dx,dy,x;
for(x=0; x<4; x++)
{
dx=i+dir[x][0];
dy=j+dir[x][1];
if(dx>=0&&dx<n&&dy>=0&&dy<m)///同理,在终点开始搜索传送门
{
if(mp[dx][dy]=='*'&&flag[dx][dy]!=1)
{
flag[dx][dy]=1;
ff(dx,dy);
}
else if(mp[dx][dy]=='$')
{
flag[xx][yy]=1;
break;
}
else continue;
}
}
}
int DFS(int i,int j)///第二步
{
int dx,dy,x;
for(x=0; x<4; x++)
{
dx=i+dir[x][0];///将起点坐标带入,然后运用递归上下左右走
dy=j+dir[x][1];
if(dx>=0&&dx<n&&dy>=0&&dy<m)///如果没超出边界
{
if(mp[dx][dy]=='*'&&flag[dx][dy]!=1)///如果是路,更新你现在的坐标,在这个基础上继续上下左右走,并将你走过的点标记
{
flag[dx][dy]=1;
DFS(dx,dy);
}
else if(mp[dx][dy]=='t')///如果到达终点,把终点标记为一,一会判断1,0就好
{
flag[dx][dy]=1;
}
else if(mp[dx][dy]=='$')///如果搜到传送门,从终点那头也寻找传送门
{
ff(xx,yy);
}
else continue;
}
}
}
int main()///第一步
{
while(cin>>n>>m)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
cin>>mp[i][j];
if(mp[i][j]=='t')
{
xx=i,yy=j;///输入地图,然后记录下终点坐标
}
}
}
memset(flag,0,sizeof(flag));///将flag数组清零
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
if(mp[i][j]=='s')///搜到起点,开始搜索;
DFS(i,j);
}
}
if(flag[xx][yy]==1)///如果终点被标记为一,输出yes
{
cout<<"YES"<<endl;
}
else cout<<"NO"<<endl;
}
}