题目链接:https://ac.nowcoder.com/acm/problem/14572
题目描述:
解题思路:
输入的时候记下起点和终点的下标,利用深度优先搜索遍历或者广度优先搜索所有能到的点。
每次dfs传能到的点,通过f数组递归下一个能到的点。当目前的点等于终点时结束递归。
每次bfs将所有到过的点对应bk数组置为1,当终点坐标被置为一就可以不用入队了。
DFS代码如下:
#include <bits/stdc++.h>
using namespace std;
char c[510][5010];
int bk[510][510];
int f[4][2]= {{0,1},{0,-1},{1,0},{-1,0}};//上下左右 四个方向
int sx,sy,ex,ey;
int n,m;
bool flag=false;
void dfs(int x,int y) {
if(x==ex&&y==ey) {//当前点到达终点
flag=true;
return ;
}
for(int i=0; i<4; i++) {
int x1=x,y1=y;
x1+=f[i][0];
y1+=f[i][1];
//cout<<x1<<" "<<y1<<endl;
//能走的情况
if(x1>0&&y1>0&&x1<=n&&y1<=m&&c[x1][y1]!='#'&&bk[x1][y1]==0&&flag==false) {
bk[x1][y1]=1;
dfs(x1,y1);//下一个点的坐标
}
}
}
int main() {
int i,j;
while( cin>>n>>m) {
for(i=1; i<=n; i++) {
for(j=1; j<=m; j++) {
cin>>c[i][j];
if(c[i][j]=='S') {
sx=i;
sy=j;
}
if(c[i][j]=='E') {
ex=i;
ey=j;
}
}
}
dfs(sx,sy);
memset(bk,0,sizeof bk);
if(flag) {
cout<<"Yes"<<endl;
} else {
cout<<"No"<<endl;
}
flag=false;
}
return 0;
}
BFS代码如下:
#include <bits/stdc++.h>
using namespace std;
char c[510][5010];
int bk[510][510];
int f[4][2]= {{0,1},{0,-1},{1,0},{-1,0}};
int ex,ey;
int n,m;
struct node {
int x,y;
};
queue<node> q;
int main() {
int i,j;
while( cin>>n>>m) {
for(i=1; i<=n; i++) {
for(j=1; j<=m; j++) {
cin>>c[i][j];
if(c[i][j]=='S') {
node p;
p.x=i;
p.y=j;
q.push(p);//将起点入队
}
if(c[i][j]=='E') {
ex=i;
ey=j;
}
}
}
while(q.size()) {
node u=q.front();
q.pop();
for(int i=0; i<4; i++) {
int x1,y1;
x1=u.x+f[i][0];//起点的上下左右
y1=u.y+f[i][1];
//前面四个判断是越界的情况.
//第五个是判断是否为障碍.
//第六个判断是否走过了.
//第七个是判断有没有到过终点.
if(x1>0&&y1>0&&x1<=n&&y1<=m&&c[x1][y1]!='#'&&bk[x1][y1]==0&&bk[ex][ey]==0) {
bk[x1][y1]=bk[u.x][u.y]+1;
node p;
p.x=x1;
p.y=y1;
q.push(p);
}
}
}
if(bk[ex][ey]!=0){//bfs完如果bk[ex][ey]不等于0说明能到,反之不能到
cout<<"Yes"<<endl;
}else{
cout<<"No"<<endl;
}
memset(bk,0,sizeof bk);
}
return 0;
}