题解 P2298 【Mzc和男家丁的游戏】
简单而典型的广搜,基础题目,不要问我为什么交了那么多次【-_-】,我太弱了。
好吧,没什么技巧,唯一要注意的是队列不要开太大,免得MLE。
真的没什么好说的。让我水一发。------
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int maxn=2000+20;
int n,m,map[maxn][maxn],d[maxn][maxn];
int que[(maxn*maxn)][3],head,tail;
int move[20][4],tx,ty,sx,sy;
void write(int n){
if(n>9) write(n/10);
putchar((n % 10)+'0');
return;
}
void init(){
move[1][1]=1,move[1][2]=0;
move[2][1]=-1,move[2][2]=0;
move[3][1]=0,move[3][2]=1;
move[4][1]=0,move[4][2]=-1;
scanf("%d%d",&n,&m);
for(int i=0;i<=n+1;i++)
for(int j=0;j<=m+1;j++){
map[i][j]=-1;
d[i][j]=1234567890;
}
char s[maxn];
for(int i=1;i<=n;i++){
scanf("%s",s);
for(int j=0;j<m;j++){
if(s[j]=='.') map[i][j+1]=0;
if(s[j]=='d') map[i][j+1]=0,tx=i,ty=j+1;
if(s[j]=='m') map[i][j+1]=0,sx=i,sy=j+1;
}
}
return;
}
void tool(int x,int y,int d){
printf("%d %d %d\n",x,y,d);
}
void bfs(){
head=tail=0;
d[sx][sy]=0;
que[tail][1]=sx,que[tail][2]=sy;
++tail;
while(head<tail){
int x=que[head][1];
int y=que[head][2];
if(x==tx && y==ty){
write(d[x][y]);
return;
}
++head;
//tool(x,y,d[x][y]);
for(int i=1;i<=4;i++){
int px=x+move[i][1];
int py=y+move[i][2];
if(map[px][py]==-1) continue;
if(d[px][py]>(d[x][y]+1)){
d[px][py]=d[x][y]+1;
que[tail][1]=px;
que[tail][2]=py;
++tail;
}
}
}
printf("No Way!");
return;
}
void test(){
putchar('\n');
printf("%d %d %d %d",sx,sy,tx,ty);
}
int main(){
init();
bfs();
//test();
return 0;
}