首先BFS找最短距离
然后DFS搜索每一条最短路径,统计成功和失败的路径数目
#include <iostream>
#include <cstdio>
#include <memory.h>
#include <queue>
#include <limits.h>
using namespace std;
const int maxn=15;
char maze[maxn][maxn];
int di[]={-1,1,0,0},dj[]={0,0,-1,1},n,m,minDis,suc,fail;
bool vis[maxn][maxn];
struct state{
int ci,cj,step;
bool hasMine;
state(int cci=0,int ccj=0,int sstep=0):ci(cci),cj(ccj),step(sstep),hasMine(false){}
};
void bfs(state s){
memset(vis,0,sizeof(vis));
queue<state>q;
q.push(s);
vis[s.ci][s.cj]=1;
while (q.size()){
state t=q.front();
q.pop();
for (int i=0;i<4;++i){
int ni=t.ci+di[i],nj=t.cj+dj[i];
if(ni>=0&&ni<n&&nj>=0&&nj<m&&maze[ni][nj]!='#'&&!vis[ni][nj]){
if(maze[ni][nj]=='T'){
minDis=t.step+1;
return;
}
vis[ni][nj]=1;
q.push(state(ni,nj,t.step+1));
}
}
}
}
void dfs(int ci,int cj,int step,bool hasMine){
if(step>minDis||maze[ci][cj]=='#'){
return;
}
else if(maze[ci][cj]=='T'&&step==minDis){
if(hasMine)fail++;
else suc++;
return;
}else if(maze[ci][cj]=='M'){
hasMine=1;
}
for (int i=0;i<4;++i){
int ni=ci+di[i],nj=cj+dj[i];
if(ni>=0&&ni<n&&nj>=0&&nj<m&&!vis[ni][nj]){
vis[ni][nj]=1;
dfs(ni,nj,step+1,hasMine);
vis[ni][nj]=0;
}
}
}
int main(){
int cas=1,t;
scanf("%d",&t);
while (t--){
scanf("%d%d\n",&n,&m);
state s;
for (int i=0;i<n;++i){
gets(maze[i]);
for (int j=0;j<m;++j){
if(maze[i][j]=='S'){
s.ci=i,s.cj=j;
}
}
}
minDis=INT_MAX;
bfs(s);
printf("Mission #%d:\n",cas++);
if(minDis==INT_MAX){
printf("Mission Impossible.\n\n");
}else{
suc=0,fail=0;
memset(vis,0,sizeof(vis));
vis[s.ci][s.cj]=1;
dfs(s.ci,s.cj,0,0);
vis[s.ci][s.cj]=0;
double r=(double)suc/(suc+fail)*100;
if(r==0.0){
printf("Mission Impossible.\n\n");
}else{
printf("The probability for the spy to get to the telegraph transmitter is %.2lf%%.\n\n",r);
}
}
}
return 0;
}