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;}
阅读全文
0 0
- Problem B bfs
- Problem B (BFS)
- 福州大学第十三届程序设计竞赛 Problem B 翻翻棋【bfs】
- Problem B
- Problem B
- Problem B
- Problem B
- Problem B
- Problem B
- Problem B
- Problem B
- Problem B
- Problem B
- Problem b
- Problem B
- Problem B
- Problem-B
- Problem B
- c++第六次实验
- [leetcode]: 415. Add Strings
- ArrayList的使用
- POM文件中配置了ReportNG监听器后,找不到配置文件了??报空指针
- Attack
- Problem B (BFS)
- Spring 4 @PropertySource和@Value注解示例
- 如何正确使用开源项目?
- c++第六次作业
- 实验6
- CF799D:Field expansion(dp)
- Linux命令基础39-apt-get命令
- jquery 模块拖拽功能的实现
- 附加依赖项值的快速求取(opencv+vs)