题意:从r走到a,遇到x多走一步,问最小走到a的步数
分析:因为r有多个,反过来想从a走到某个r的最小步数,简单的BFS。我对这题有特殊的感情,去年刚来集训队时肉鸽推荐了这题,当时什么都不会,看个数组模拟队列的BFS看的头晕,现在看起来也不过如此,额,当年开始是从r走到a的,因为数据巨弱才过的,应该要用到优先队列。
/************************************************* Author :Running_Time* Created Time :2015/9/25 星期五 09:13:51* File Name :B_BFS.cpp ************************************************/#include #include #include #include #include #include #include #include #include #include #include #include #include
当年的代码不忍直视。。。
#include typedef struct point{ int x,y,step;}target;int N,M,dir[4][2]={0,1,0,-1,1,0,-1,0},ax,ay;int flag[202][202];char map[302][302];target que[40005];int BFS(target start){ int end,top,i; int min=1000000; target in,next; end=top=0; que[top]=start; while (top>=end) { in=que[end]; end=(end+1); for (i=0;i<4;i++) { next.x=in.x+dir[i][0]; next.y=in.y+dir[i][1]; if (map[next.x][next.y]=='r') { if (min>in.step+1) min=in.step+1; } if (next.x>=0&&next.x =0&&next.y in.step+1) { next.step=in.step+1; if (map[next.x][next.y]=='x') next.step++; flag[next.x][next.y]=next.step; top=(top+1); que[top]=next; } } } } if (min!=1000000)return min; else return -1;}int main(){ int i,j,num; target start; while (scanf("%d%d",&N,&M)!=EOF) { for (i=0;i