Problem B (BFS)

来源:互联网 发布:js脚本代码 编辑:程序博客网 时间:2024/06/04 23:36

Description

code4101听说这次选拔赛要他出3道题,吓得哭晕在厕所里一整天。第二天他早早的就去图书馆,废寝忘食(早餐午餐都没吃)的出题,晚上终于完成了。 
现在他决定犒劳自己,去校内的两个食堂各吃一顿晚餐。 
已知学校是个10*10的网格,code4101当前所在位置是A,他每次能从当前格移动到上下左右4格中的任意一格,学校内共有六个食堂,编号1,2,...,6。 
code4101是路痴,不知道先去哪个食堂再去哪个食堂,使得总路程最短,所以只好请你来带路。 

Input

输入数据的第一行为一个整数T,表示有T(0 < T < 20)组测试数据。 
每个测试有10行,每行10个字符。字符’A’是起点,’1’~’6’代表6个食堂所在位置。除了’#’代表不能行走的障碍点,’.’等字符所在格子都是可以行走的通路。 
每两个测试间会有一个空行。输入数据保证不会出现文中未提到的字符,且解一定存在。 

Output

每个测试数据在一行输出一个数字,代表最小的总移动次数。

Sample Input

2.......#12..#....#.#..##...A#..........#...###......#.#..4.........#...5#.#...........3......6......A......#....#......#..##..1............#...###......#2#..4.........#...5#.#...........3......6......

Sample Output

712

思路: BFS,用循环判断最短路程即可。我们可以发现学校的bfs题都大同小异,都是基础模型上的简单变形,更多练的是熟练度和细心把。

当你做完学校的题会发现都是水题,想提高只做学校的题肯定不行。 但是学校的OJ无疑我对它感情很深,是它带我入门的。

如今刷的差不多了。我也是整理下以前做过一些算法题,巩固下基础,也给今后刚入门刷学校OJ的有缘人做参考把。


#include <cstdio>  #include <cstring>  #include <algorithm>  #include <queue>  using namespace std; #define min(a,b)  (((a)<(b))?(a):(b))int a[11][11];int x[10];int y[10];const int inf = 99999999;  struct note{int x;int y;int s;};int dis(int startx,int starty,int p,int q){int dx[]={0,1,0,-1};int dy[]={1,0,-1,0};int book[11][11]={0};int tx,ty;int i,j;int flag=0;note now,next;queue<note> que;int k;now.x=startx;now.y=starty;now.s=0;que.push(now);book[startx][starty]=1;while(!que.empty()){now=que.front();que.pop();for(k=0;k<=3;k++){tx=now.x+dx[k];ty=now.y+dy[k];if(tx<1 || tx> 10 || ty<1 || ty>10)continue;if(a[tx][ty]==0 &&book[tx][ty]==0){book[tx][ty]=1;next.x=tx;next.y=ty;next.s=now.s+1;que.push(next);}if(tx == p && ty == q){flag=1;break;}}if(flag==1){return next.s;}}return inf;}int main(){int n;int i,j;char ch;int ans;scanf("%d",&n);while(n--){for(i=1;i<=10;i++)for(j=1;j<=10;j++){scanf(" %c",&ch);if(ch=='.'){ a[i][j]=0;}else if(ch=='#')  {a[i][j]=1;}else if( ch>'0' && ch <'7'){ a[i][j]=0;  x[ch-'0']=i;  y[ch-'0']=j;}else if(ch='A'){a[i][j]=0;x[0]=i;y[0]=j;}}ans = inf;  for (i = 1; i <= 6; i++)for (j = 1; j <= 6; j++) {  if (j == i) continue;  ans = min(ans, dis(x[0],y[0],x[i],y[i])+dis(x[i],y[i],x[j],y[j]));  }           printf("%d\n",ans);  getchar();}return 0;}