【Aizu - 0558】Cheese(bfs)

-->Cheese

原文是日语,这里就写中文了

Descriptions:

在H * W的地图上有N个奶酪工厂,每个工厂分别生产硬度为1-N的奶酪。有一只老鼠准备从出发点吃遍每一个工厂的奶酪。老鼠有一个体力值,初始时为1,每吃一个工厂的奶酪体力值增加1(每个工厂只能吃一次),且老鼠只能吃硬度不大于当前体力值的奶酪。 老鼠从当前格到上下左右相邻的无障碍物的格需要时间1单位,有障碍物的格不能走。走到工厂上时即可吃到该工厂的奶酪,吃奶酪时间不计。问吃遍所有奶酪最少用时

input

第一行三个整数H(1 <= H <= 1000)、W(1 <= W <=1000)、N(1 <= N <= 9),之后H行W列为地图, “.“为空地, ”X“为障碍物,”S“为老鼠洞,N表示有N个生产奶酪的工厂,硬度为1-N。

output 

吃完所有工厂的最小步数

Sample Input 1

3 3 1
S..
...
..1

Sample Output 1

4

Sample Input 2

4 5 2
.X..1
....X
.XX.S
.2.X.

Sample Output 2

12

Sample Input 3

10 10 9
.X...X.S.X
6..5X..X1X
...XXXX..X
X..9X...X.
8.X2X..X3X
...XX.X4..
XX....7X..
X..X..XX..
X...X.XX..
..X.......

Sample Output 3

91

题目链接:

https://vjudge.net/problem/Aizu-0558

题目比较复杂

简单来说就是让你求从起点‘S’到‘1’,‘1’到‘2’,‘2’到‘3’...‘n-1’到‘n’的最短距离,这样大家应该都会了吧,我这里写的bfs,具体可以看注释,dfs应该也行......

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#define mod 1000000007
#define eps 1e-6
#define ll long long
#define INF 0x3f3f3f3f
#define MEM(x,y) memset(x,y,sizeof(x))
#define Maxn 1005
using namespace std;
struct node
{
    int x,y,step;//在(x,y)的步数
};
node now,net;
node a[Maxn*Maxn];//工厂
char mp[Maxn][Maxn];//地图
int vis[Maxn][Maxn];//标记是否走过
int dt[][2] = {{0,1},{1,0},{0,-1},{-1,0}};//4个方向
int h,w,n;
int total;
int bfs(node s,node e)//从s走到e
{
    MEM(vis,0);//没次都要初始化为0
    queue<node>q;
    now.x=s.x,now.y=s.y,now.step=s.step;//初始化队列
    vis[now.x][now.y]=1;
    q.push(now);
    while(!q.empty())
    {
        now=q.front();
        q.pop();
        if(now.x==e.x&&now.y==e.y)//找到目的地
            return now.step;
        for(int i=0; i<4; i++)//四个方向走法
        {
            net.x=now.x+dt[i][0];
            net.y=now.y+dt[i][1];
            net.step=now.step+1;
            if(net.x>=0&&net.x<h&&net.y>=0&&net.y<w&&!vis[net.x][net.y]&&mp[net.x][net.y]!=‘X‘)//满足条件
            {
                vis[net.x][net.y]=1;//标记走过
                q.push(net);
            }
        }
    }
}
int main()
{
    cin>>h>>w>>n;
    for(int i=0; i<h; i++)
        for(int j=0; j<w; j++)
        {
            cin>>mp[i][j];
            if(mp[i][j]==‘S‘)//把起点设为0
                mp[i][j]=‘0‘;
            for(int k=0; k<=n; k++)//标记工厂,分别储存
            {
                if(mp[i][j]-‘0‘==k)
                {
                    a[k].x=i;
                    a[k].y=j;
                    a[k].step=0;
                }
            }
        }
    total=0;
    for(int i=0; i<n; i++)//开始搜索  增加步数
        total+=bfs(a[i],a[i+1]);//a[0]到a[1] a[1]到a[2]......
    cout<<total<<endl;

}

原文地址:https://www.cnblogs.com/sky-stars/p/11186562.html

时间: 2024-08-02 04:49:47

【Aizu - 0558】Cheese(bfs)的相关文章

【HDU - 3533】Escape(bfs)

Escape  Descriptions: 一个人从(0,0)跑到(n,m),只有k点能量,一秒消耗一点,在图中有k个炮塔,给出炮塔的射击方向c,射击间隔t,子弹速度v,坐标x,y问这个人能不能安全到达终点要求: 1.人不能到达炮塔所在的坐标2.炮塔会挡住子弹3.途中遇到子弹是安全的,但是人如果停在这个坐标,而子弹也刚好到这个坐标,人就被射死4.人可以选择停止不动 Input 对于每个测试用例,第一行有四个整数,m.n.k和d (2<=m, n<=100, 0<=k<=100, m

【Hibernate学习】 ——ORM(三)

前面几种关系我们以前就经常用,对于继承我们也并不陌生,经常接触的类与类之间的继承用extends关键字,那么在表与表的关系中如何表示呢?下面我们来讲继承映射. 继承有三种实现的策略,单表继承,具体表继承,类表继承.下面来分析一下这三种方式 继承关联类关系  单表继承 每棵类继承树使用一个表,可知,这三个类在一张表中.如下表: 这张表包括了父类,子类的所有属性,通过Type来区分是哪个子类. 对象模型映射到关系模型: <classname="com.bjpowernode.hibernat.

【Hibernate学习】 ——ORM(一)

Hibernate是一种能实现ORM的框架.ORM即Object Relational Mapping,对象关系映射.也就是将关系数据库中表的数据映射成为对象,也就是说将表与表之间的操作映射成对象与对象之间的操作,通过实体类来达到操作表的目的.总之就是把对数据库的操作转化为对对象的操作,从而更体现了面向对象的思想. 一对一关联映射策略包括主键关联和唯一外键关联. 单向一对一 主键关联 让两个对象有相同的主键值,表名它们之间的一对一关系,数据库没有额外的字段来维护它们之间的关系,仅仅通过表的主键来

【Hibernate学习】 ——ORM(二)

上篇博客主要介绍了一对一的关系,主要理解单向与双向的区别,主键关联与唯一外键关联的区别.下面继续介绍一对多与多对多关联. 一对多关联映射 一个班级对应多个学生 单向一对多关系 关系表: classes代码 <classname="com.bjpowernode.hibernat.Classes"table="t_classes"> <idname="id"> <generatorclass="native&

【HDOJ 5838】Mountain(局部极小值)

[HDOJ 5838]Mountain(局部极小值) Mountain Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description Zhu found a map which is a N * M rectangular grid.Each cell has a height and there are no two cells which have

【POJ 3071】 Football(DP)

[POJ 3071] Football(DP) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4350   Accepted: 2222 Description Consider a single-elimination football tournament involving 2n teams, denoted 1, 2, -, 2n. In each round of the tournament, all tea

【POJ 3034】 Whac-a-Mole(DP)

[POJ 3034] Whac-a-Mole(DP) Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3621   Accepted: 1070 Description While visiting a traveling fun fair you suddenly have an urge to break the high score in the Whac-a-Mole game. The goal of the W

【UOJ#246】套路(动态规划)

[UOJ#246]套路(动态规划) 题面 UOJ 题解 假如答案的选择的区间长度很小,我们可以做一个暴力\(dp\)计算\(s(l,r)\),即\(s(l,r)=min(s(l+1,r),s(l,r-1),abs(a_r-a_l))\). 我们发现\(s(l,r)\le \frac{m}{r-l+1}\),那么当长度足够大的时候\(s(l,r)\)的取值很小. 所以我们对于询问分治处理,当长度小于\(\sqrt m\)时,直接\(dp\)计算贡献. 否则,当长度大于\(\sqrt m\)时,枚举

【UOJ#22】【UR #1】外星人(动态规划)

[UOJ#22][UR #1]外星人(动态规划) 题面 UOJ 题解 一道简单题? 不难发现只有按照从大往小排序的顺序选择的才有意义,否则先选择一个小数再去模一个大数是没有意义的. 设\(f[i][j]\)表示考虑了前\(i\)个数,模完之后是\(j\)的方案数. 转移的时候枚举这个数是模还是不模,如果不模的话就要把它放到后面某个小数的后面,方案数是\(n-i\). #include<iostream> #include<cstdio> #include<cstdlib>