点击前往试题目录:https://blog.csdn.net/best335/article/details/99550556
时间使用:15ms
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
typedef pair<int,int> P;
int main(){
int R,C,ans=0;
cin>>R>>C;
P s;//开始位置
string maps[51];
for(int i=0;i<R;++i){
cin>>maps[i];
for(int j=0;j<C;++j)
if(maps[i][j]=='S') s=P(i,j);
}
bool isStuck = true;
bool visit[51][51];
memset(visit,1,sizeof(visit));
P moves[2501];//从S可以到达的点的位置
int size=0;//S可以到达的点的个数
queue<P> q;
q.push(s);
while(!q.empty()){
P& p = q.front();
int &x=p.first,&y=p.second;
int lx=x-1,rx=x+1,ly=y-1,ry=y+1;
switch(maps[x][y]){
case 'T':
isStuck=false;
case 'S':
case '+':
if(lx>-1&&maps[lx][y]!='#'&&visit[lx][y]) visit[lx][y]=false,q.push(P(lx,y)),moves[size++]=P(lx,y);
if(rx< R&&maps[rx][y]!='#'&&visit[rx][y]) visit[rx][y]=false,q.push(P(rx,y)),moves[size++]=P(rx,y);
case '-':
if(ly>-1&&maps[x][ly]!='#'&&visit[x][ly]) visit[x][ly]=false,q.push(P(x,ly)),moves[size++]=P(x,ly);
if(ry< C&&maps[x][ry]!='#'&&visit[x][ry]) visit[x][ry]=false,q.push(P(x,ry)),moves[size++]=P(x,ry);
break;
case '|':
if(lx>-1&&maps[lx][y]!='#'&&visit[lx][y]) visit[lx][y]=false,q.push(P(lx,y)),moves[size++]=P(lx,y);
case '.':
if(rx< R&&maps[rx][y]!='#'&&visit[rx][y]) visit[rx][y]=false,q.push(P(rx,y)),moves[size++]=P(rx,y);
break;
}
q.pop();
}
if(isStuck)//S到达不了T
cout<<"I'm stuck!"<<endl;
else{
short log[51][51];//0 未访问 1可以到达T -1不能到达T
memset(log,0,sizeof(log));
for(int i=0,ni=size;i<ni;++i){//遍历所有S可以到达的点 判断这个点是否能够到达T
memset(visit,1,sizeof(visit));
isStuck=true;
queue<P> q;
q.push(moves[i]);
while(!q.empty()&&isStuck){
P& p = q.front();
int &x=p.first,&y=p.second;
if(log[x][y]==1) isStuck=false;
if(log[x][y]==0){
int lx=x-1,rx=x+1,ly=y-1,ry=y+1;
switch(maps[x][y]){
case 'T':
isStuck=false;
case 'S':
case '+':
if(lx>-1&&maps[lx][y]!='#'&&visit[lx][y]) visit[lx][y]=false,q.push(P(lx,y));
if(rx< R&&maps[rx][y]!='#'&&visit[rx][y]) visit[rx][y]=false,q.push(P(rx,y));
case '-':
if(ly>-1&&maps[x][ly]!='#'&&visit[x][ly]) visit[x][ly]=false,q.push(P(x,ly));
if(ry< C&&maps[x][ry]!='#'&&visit[x][ry]) visit[x][ry]=false,q.push(P(x,ry));
break;
case '|':
if(lx>-1&&maps[lx][y]!='#'&&visit[lx][y]) visit[lx][y]=false,q.push(P(lx,y));
case '.':
if(rx< R&&maps[rx][y]!='#'&&visit[rx][y]) visit[rx][y]=false,q.push(P(rx,y));
break;
}
}
q.pop();
}
if(isStuck) ++ans,log[moves[i].first][moves[i].second]=-1;//访问不了T
else log[moves[i].first][moves[i].second]=1;//可以到达T
}
cout<<ans<<endl;
}
return 0;
}