LightOJ——1066Gathering Food(BFS)
| Time Limit: 2 second(s) | Memory Limit: 32 MB |
Winter is approaching! The weather is getting colder and days are becoming shorter. The animals take different measures to adjust themselves during this season.
- Some of them "migrate." This means they travel to other places where the weather is warmer.
- Few animals remain and stay active in the winter.
- Some animals "hibernate" for all of the winter. This is a very deep sleep. The animal's body temperature drops, and its heartbeat and breathing slow down. In the fall, these animals get ready for winter by eating extra food and storing it as body fat.
For this problem, we are interested in the 3rd example and we will be focusing on 'Yogi Bear'.
Yogi Bear is in the middle of some forest. The forest can be modeled as a square grid of sizeN x N. Each cell of the grid consists of one of the following.
. an empty space
# an obstacle
[A-Z] an English alphabet
There will be at least 1 alphabet and all the letters in the grid will be distinct. If there arek letters, then it will be from the firstk alphabets. Supposek = 3, that means there will be exactly oneA, oneB and one C.
The letters actually represent foods lying on the ground. Yogi starts from position'A' and sets off with a basket in the hope of collecting all other foods. Yogi can move to a cell if it shares an edge with the current one. For some superstitious reason, Yogi decides to collect all the foods in order. That is, he first collectsA, thenB, thenC and so on until he reaches the food with the highest alphabet value. Another philosophy he follows is that if he lands on a particular food he must collect it.
Help Yogi to collect all the foods in minimum number of moves so that he can have a long sleep in the winter.
Input
Input starts with an integer T (≤ 200), denoting the number of test cases.
Each case contains a blank line and an integer N (0 < N < 11), the size of the grid. Each of the nextN lines containsN characters each.
Output
For each case, output the case number first. If it's impossible to collect all the foods, output'Impossible'. Otherwise, print the shortest distance.
Sample Input |
Output for Sample Input |
|
4 5 A.... ####. ..B.. .#### C.DE. 2 AC .B 2 A# #B 3 A.C ##. B.. |
Case 1: 15 Case 2: 3 Case 3: Impossible Case 4: Impossible |
最近找回上学期遗留的题目做做,发现BFS果然比DFS简单。很多都是无脑拓展……,这题有一个坑点就是取过字母的地方还是可以走的,然而就看成一个点 "." 即可,因为这个WA数次……
代码:
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<sstream>
#include<cstring>
#include<cstdio>
#include<string>
#include<deque>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<map>
using namespace std;
#define INF 0x3f3f3f3f
#define MM(x) memset(x,0,sizeof(x))
#define MMINF(x) memset(x,INF,sizeof(x))
typedef long long LL;
const double PI=acos(-1.0);
const int N=13;
char pos[N][N];
int vis[N][N];
struct info
{
int x;
int y;
int step;
info(){}
info(int xx,int yy):x(xx),y(yy){}
};
info direct[4];
info operator+(info a,info b)
{
info c;
c.x=a.x+b.x;
c.y=a.y+b.y;
c.step=a.step+b.step;
return c;
}
int r,n;
char goal;
int check(info v)
{
if(v.x>=0 && v.y>=0 && v.x<n && v.y<n && (pos[v.x][v.y]=='.'||pos[v.x][v.y]==goal) && (!vis[v.x][v.y]))
return 1;
return 0;
}
int zuobiao[2][30];
int main(void)
{
int tcase,i,j,cnt;
direct[0].x=1;direct[0].y=0;direct[0].step=1;
direct[1].x=-1;direct[1].y=0;direct[1].step=1;
direct[2].x=0;direct[2].y=1;direct[2].step=1;
direct[3].x=0;direct[3].y=-1;direct[3].step=1;
scanf("%d",&tcase);
for (int q=1; q<=tcase; q++)
{
MM(pos);
MM(vis);
scanf("%d",&n);
cnt=0;
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
cin>>pos[i][j];
if(pos[i][j]>='A'&&pos[i][j]<='Z')
{
zuobiao[0][pos[i][j]-'A']=i;
zuobiao[1][pos[i][j]-'A']=j;
cnt++;
}
}
}
goal='B';
r=0;
bool done=true;
for (int w=0; w<cnt; w++)
{
MM(vis);
if(!done)
break;
done=false;
info t=info(zuobiao[0][w],zuobiao[1][w]);
t.step=0;
queue<info>Q;
Q.push(t);
vis[t.x][t.y]=1;
pos[t.x][t.y]='.';
while (!Q.empty())
{
info no=Q.front();
Q.pop();
if(pos[no.x][no.y]==goal)
{
goal++;
pos[no.x][no.y]='.';
r+=no.step;
done=true;
break;
}
for (i=0; i<4; i++)
{
info v=no+direct[i];
if(check(v))
{
Q.push(v);
vis[v.x][v.y]=1;
}
}
}
}
(goal=='A'+cnt||cnt==0)?printf("Case %d: %d\n",q,r):printf("Case %d: Impossible\n",q);
}
return 0;
}
LightOJ——1066Gathering Food(BFS)的更多相关文章
- 深搜(DFS)广搜(BFS)详解
图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...
- 【算法导论】图的广度优先搜索遍历(BFS)
图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...
- 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现
1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...
- 【BZOJ5492】[HNOI2019]校园旅行(bfs)
[HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...
- 深度优先搜索(DFS)和广度优先搜索(BFS)
深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...
- 图的 储存 深度优先(DFS)广度优先(BFS)遍历
图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...
- 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)
一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...
- 层层递进——宽度优先搜索(BFS)
问题引入 我们接着上次“解救小哈”的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLian/p/74296 ...
- HDU.2612 Find a way (BFS)
HDU.2612 Find a way (BFS) 题意分析 圣诞节要到了,坤神和瑞瑞这对基佬想一起去召唤师大峡谷开开车.百度地图一下,发现周围的召唤师大峡谷还不少,这对基佬纠结着,该去哪一个...坤 ...
随机推荐
- 【extjs6学习笔记】0.2 准备:类库结构
- 系统妈Ghost Win10 64位快速安装版 V2016年2月
系统妈Ghost win10 64位快速安装版 V2016年2月,更新了最新系统补丁,升级系统版本号为2016年2月份.这款累积更新补丁会取代之前的版本.本系统还附带最常用的装机必备软件.QQ等. 系 ...
- Linux SSH无密码login
一:ssh原理图为: 1.就是为了让两个linux机器之间使用ssh不需要用户名和密码.采用了数字签名RSA或者DSA来完成这个操作 2.模型分析 假设 A (192.168.20.59)为客户机器, ...
- python代理检测
import socket,threading,os,sys,queue,re socket.setdefaulttimeout(5) path=sys.path[0] if os.path.isfi ...
- select *from where 和select *from jion on 语句的差别
https://zhidao.baidu.com/question/541791438.html select 学号 a,成绩 a,姓名 b from 成绩表 a,学生表 b where a.学号=b ...
- WPF知识点全攻略09- 附加属性
附加属性也是一种特殊的依赖属性. Canvas中的Canvas.Left,Canvas.Top ,DockPanel中DockPanel.Dock等就是附加属性. 更加.NET类属性的写法经验.这个中 ...
- caffe修改需要的东西 6:40
https://blog.csdn.net/zhaishengfu/article/details/51971768?locationNum=3&fps=1
- C#栈Stack的使用
using System; using System.Collections.Generic; namespace CSharp栈 { class Program { static void Main ...
- bootstrap历练实例:标签式的导航菜单
本章将讲解bootstrap提供的用于定义导航元素的一些选项,它使用相同的标签和基类.nav.Bootsrtap也提供了一个用于共享标记和状态的帮助器类.改变修饰的class,可以在不同的样式间进行切 ...
- 【转】4w+1h 教你如何做用户画像
记得14年开始做用户画像的时候,对于用户画像完全没有概念,以为是要画一幅幅图画,经过两年多的学习和理解,渐渐的总结出了一些方法和技巧,在这里就通过4个W英文字母开头和1个H英文字母开头的单词和大家分享 ...
