题目:https://vjudge.net/problem/HDU-2612#author=zhang95986
分析:经典bfs,具体见代码。
#include <stdio.h> #include <string.h> int n,m; char c[201][201]; int f[201][201];//标记 int tbs[201][201][2];//到达土拨鼠的位置时间 int l[40100][3];//模拟队列 int q[5]={0,-1,0,1,0},p[5]={0,0,1,0,-1};//移动 int check(int x,int y){ if(x>=0&&x<n&&y>=0&&y<m&&c[x][y]!='#'&&f[x][y]==0) return 1; else return 0; } void bfs(int x,int y,int z){//z确定哪个人 memset(l,0,sizeof(l)); memset(f,0,sizeof(f)); f[x][y]=1; int h=0,r=1; l[h][0]=x; l[h][1]=y; l[h][2]=0; int x1,y1; while(h<r){ for(int i=1;i<=4;i++){ x1=l[h][0]+p[i]; y1=l[h][1]+q[i]; if(check(x1,y1)){ f[x1][y1]=1; l[r][0]=x1; l[r][1]=y1; l[r][2]=l[h][2]+1; r++; if(c[x1][y1]=='@'){ if(z==0)tbs[x1][y1][0]=l[h][2]+1; else tbs[x1][y1][1]=l[h][2]+1; } } } h++; } } int main(void){ while(scanf("%d",&n)!=EOF){ scanf("%d",&m); int x1=-1,y1=-1,x2=-1,y2=-1;//两人坐标 memset(c,'