解题思路:广搜模板,搜两次就好了

注意事项:

参考代码:

#include <bits/stdc++.h>

using namespace std;

int n,m;

char mp[55][55];

struct node{

int x;

int y;

int cnt;

}Node,t,s,k,newNode;

int dx[4]={0,0,1,-1};

int dy[4]={1,-1,0,0};

int gg[55][55]={0};

bool judeg(int x,int y){

if(x<0||y<0||x>=n||y>=m)

return false;

if(mp[x][y]=='1')

return false;

if(gg[x][y]!=0)

return false;

return true;

}

queue <node> q,Q;

void bfs(){

while(!q.empty()){

node top = q.front();

gg[top.x][top.y]=1;

q.pop();

if(top.x==s.x&&top.y==s.y){

s.cnt=top.cnt;

break;

}

for(int i=0;i<4;i++){

int newX = top.x+dx[i];

int newY = top.y+dy[i];

if(judeg(newX,newY)==true){

Node.x=newX;

Node.y=newY;

Node.cnt=top.cnt+1;

q.push(Node);

}

}

}

}

int BFS(){

Q.push(s);

while(!Q.empty()){

node top = Q.front();

Q.pop();

gg[top.x][top.y]=1;

if(top.x==k.x&&top.y==k.y)

return top.cnt;

for(int i=0;i<4;i++){

int newX = top.x+dx[i];

int newY = top.y+dy[i];

if(judeg(newX,newY)==true){

newNode.x=newX;

newNode.y=newY;

newNode.cnt=top.cnt+1;

Q.push(newNode);

}

}

}

}

int main()

{

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]=='S'){//开始 

t.x=i;

t.y=j;

t.cnt=0;

}

if(mp[i][j]=='T'){//中转 

s.x=i;

s.y=j;

}

if(mp[i][j]=='E'){//结束 

k.x=i;

k.y=j;

}

}

}

q.push(t);

bfs();

memset(gg,0,sizeof(gg));

cout<<BFS();

return 0;



点赞(0)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 1 条评论

东星耀阳 2年前 回复TA
为什么搜两次只过了80%