题目分析
思路
深度优先探索或是广度优先探索
分析
两人速度相同,我假定是一个人在走,用深度优先探索,先走到哪个门,对应那个人最先到达终点。
广度优先探索同理。
代码
一、
#include<stdio.h>
#include<string.h>
using namespace std;
char a[25][25];
int flag[25][25];
int dd[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
bool df(int x,int y){
for(int i=0;i<4;i++){
int d1=x+dd[i][0];
int d2=y+dd[i][1];
if(a[d1][d2]=='.'&&flag[d1][d2]==0&&a[d1][d2]!='#'){
flag[d1][d2]=1;
if( df(d1,d2))
return true;
}
if(a[d1][d2]=='a')
return true;
else if(a[d1][d2]=='b')
return false;
}
}
int main(){
int m,n,s1,s2;
int T;
scanf("%d",&T);
getchar();
while(T--){
scanf("%d%d",&m,&n);
getchar();
memset(flag,0,sizeof(flag));
memset(a,'#',sizeof(a));
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
scanf("%c",&a[i][j]);
if(a[i][j]=='s'){
s1=i;
s2=j;
}
}
getchar();
}
if(df(s1,s2))
printf("a\n");
else
printf("b\n");
}
return 0;
}
二、
#include<stdio.h>
#include<queue>
using namespace std;
struct Node{
int x,y,d;
}temp;
char a[25][25];
int n,m;
int dd[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
queue<Node>q;
bool bfs(int sx,int sy){
while(!q.empty())
q.pop();
temp.x=sx;
temp.y=sy;
temp.d=0;
q.push(temp);
while(!q.empty()){
temp=q.front();
q.pop();
int x=temp.x;
int y=temp.y;
int d=temp.d;
if(a[x][y]=='#')continue;
if(a[x][y]=='a')return true;
if(a[x][y]=='b')return false;
a[x][y]='#';
for(int i=0;i<4;i++){
int xx=x+dd[0][i];
int yy=y+dd[1][i];
if(xx>=0&&xx<n&&yy>=0&&yy<m&&a[xx][yy]!='#'){
temp.x=xx;
temp.y=yy;
temp.d=d+1;
q.push(temp);
}
}
}
return false;
}
int main(){
int T,sx,sy;
while(~scanf("%d",&T)){
while(T--){
scanf("%d%d",&n,&m);
getchar();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%c",&a[i][j]);
if(a[i][j]=='s'){
sx=i;
sy=j;
}
}
getchar();
}
printf(bfs(sx,sy)?"a\n":"b\n");
}
}
return 0;
}