题目链接:https://ac.nowcoder.com/acm/problem/14572
题目描述:
输入的时候记下起点和终点的下标,利用深度优先搜索遍历或者广度优先搜索所有能到的点。
每次dfs传能到的点,通过f数组递归下一个能到的点。当目前的点等于终点时结束递归。
每次bfs将所有到过的点对应bk数组置为1,当终点坐标被置为一就可以不用入队了。
#includeusing 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< 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"< cout<<"No"< BFS代码如下: #includeusing 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 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"< cout<<"No"<



