HDU 2612-Find a way(c语言版)
题目: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,'\0',sizeof(c)); memset(f,0,sizeof(f)); memset(tbs,0,sizeof(tbs)); memset(l,0,sizeof(l)); for(int i=0;i<n;i++)scanf("%s",c[i]); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(c[i][j]=='Y'){ x1=i;y1=j; } if(c[i][j]=='M'){ x2=i;y2=j; } } } //for(int i=0;i<n;i++){ // for(int j=0;j<m;j++){ // printf("%c",c[i][j]); // } // printf("\n"); // } // printf("%d %d %d %d",x1,y1,x2,y2); bfs(x1,y1,0); bfs(x2,y2,1); int min=100000000; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(tbs[i][j][0]!=0){ // printf("%d %d",tbs[i][j][0],tbs[i][j][1]); int sum=11*(tbs[i][j][0]+tbs[i][j][1]); if(sum<min)min=sum; } } } printf("%d\n",min); } return 0; }
终究独木难支。