問題

今年も JOI 町のチーズ工場がチーズの生産を始め,ねずみが巣から顔を出した.JOI 町は東西南北に区画整理されていて,各区画は巣,チーズ工場,障害物,空き地のいずれかである.ねずみは巣から出発して全てのチーズ工場を訪れチーズを 1 個ずつ食べる.

この町には,N 個のチーズ工場があり,どの工場も1種類のチーズだけを生産している.チーズの硬さは工場によって異なっており,硬さ 1 から N までのチーズを生産するチーズ工場がちょうど 1 つずつある.

ねずみの最初の体力は 1 であり,チーズを 1 個食べるごとに体力が 1 増える.ただし,ねずみは自分の体力よりも硬いチーズを食べることはできない.

ねずみは,東西南北に隣り合う区画に 1 分で移動することができるが,障害物の区画には入ることができない.チーズ工場をチーズを食べずに通り過ぎることもできる.すべてのチーズを食べ終えるまでにかかる最短時間を求めるプログラムを書け.ただし,ねずみがチーズを食べるのにかかる時間は無視できる.

入力

入力は H+1 行ある.1 行目には 3 つの整数 H,W,N (1 ≤ H ≤ 1000,1 ≤ W ≤ 1000,1 ≤ N ≤ 9) がこの順に空白で区切られて書かれている.2 行目から H+1 行目までの各行には,'S','1', '2', ..., '9','X','.' からなる W 文字の文字列が書かれており,各々が各区画の状態を表している.北から i 番目,西から j 番目の区画を (i,j) と記述することにすると (1 ≤ i ≤ H, 1 ≤ j ≤ W),第 i+1 行目の j 番目の文字は,区画 (i,j) が巣である場合は 'S' となり,障害物である場合は 'X' となり,空き地である場合は '.' となり,硬さ 1, 2, ..., 9 のチーズを生産する工場である場合はそれぞれ '1', '2', ..., '9' となる.入力には巣と硬さ 1, 2, ..., N のチーズを生産する工場がそれぞれ 1 つずつある.他のマスは障害物または空き地であることが保証されている.ねずみは全てのチーズを食べられることが保証されている.

出力

すべてのチーズを食べ終えるまでにかかる最短時間(分)を表す整数を 1 行で出力せよ.

入出力例

入力例 1

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

出力例 1

4

入力例 2

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

出力例 2

12

入力例 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.......

出力例 3

91

問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。

问题链接:AOJ0558 Cheese。

题意简述

输入正整数w、h和N,w为列数,h为行数,N为奶酪的最大硬度。输入h×w矩阵 (1 <= h <= 1000; 1 <= w <= 1000;1 <= N <= 9),其中:

'S'代表老鼠的巢(即起点);

数字字符1,2,...,N代表奶酪工厂(其生产的奶酪硬度由数字指定,奶酪硬度只能是1-9);

'.'代表空地;

'X'代表障碍物。

老鼠最初的体力为1,每吃一个奶酪体力增加1。但是老鼠不能吃超过自己体力的奶酪。

老鼠每移动一个区域,需要1分钟的时间,但是不能进入障碍物的区域。老鼠可以不吃奶酪通过奶酪工厂。老鼠吃遍每一个奶酪工厂的奶酪(各吃一块),求所需要的最短时间。

老鼠吃奶酪的时间可以忽略不计。

问题分析

一般而言,求最佳解用BFS。

老鼠只能按顺序吃硬度为1,2,...,N的奶酪,否则体力不济。

所以,实际上就是计算从S到1距离,1到2的距离,......,n-1到n的距离,最后输出这些距离之和。

程序说明:程序中使用方向数组,使得各个方向的试探的程序就会变得简洁了,用循环处理即可。

AC的C++语言程序如下:

/* AOJ0558 Cheese */#include <iostream>
#include <cctype>
#include <queue>
#include <string.h>using namespace std;const int DIRECTSIZE = 4;
struct _direct {int drow;int dcol;
} direct[DIRECTSIZE] = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};const int N = 1000;
const int N2 = 10;
char grid[N][N], visited[N][N];
int h, w, n;
struct _factory {int row, col;
} factory[N2];struct _node {int row, col, level;
};int bfs(int n, char goal)
{memset(visited, 0, sizeof(visited));_node start={factory[n-1].row, factory[n-1].col, 0}, temp;visited[start.row][start.col] = 1;queue<_node> q;q.push(start);while(!q.empty()) {_node front = q.front();q.pop();for(int i=0; i<DIRECTSIZE; i++) {int nextrow = front.row + direct[i].drow;int nextcol = front.col + direct[i].dcol;if( 0 <= nextrow && nextrow < h && 0 <= nextcol && nextcol < w) {if(grid[nextrow][nextcol] == goal) {return front.level + 1;} else if(visited[nextrow][nextcol] == 0 && grid[nextrow][nextcol] != 'X') {visited[nextrow][nextcol] = 1;temp.row = nextrow;temp.col = nextcol;temp.level = front.level + 1;q.push(temp);}}}}return 0;
}int main()
{while(cin >> h >> w >> n) {for(int i=0; i<h; i++)for(int j=0; j<w; j++) {cin >> grid[i][j];if(grid[i][j] == 'S') {factory[0].row = i;factory[0].col = j;} else if(isdigit(grid[i][j])) {factory[grid[i][j] - '0'].row = i;factory[grid[i][j] - '0'].col = j;}}int minstep = 0;char goal = '1';for(int i=1; i<=n; i++) {minstep += bfs(i, goal);goal++;}cout << minstep << endl;}return 0;
}

AOJ0558 Cheese【BFS】相关推荐

  1. 【BFS】魔板(c++基础算法)

    本专栏上一篇:[BFS]八数码问题(c++基础算法) 目录 一.读题 ①题面 ②题意 三.做题 ①算法原理 ②算法实现 Ⅰ三种基本操作 Ⅱ操作序列 Ⅲ输出 Ⅳ一个特殊情况 四.AC代码 最后 一.读题 ...

  2. POJ 3414 Pots【BFS】+ Python

    原题链接: 3414 -- Pots 参考资料:POJ 3414 - Pots | 眈眈探求 POJ 3414 Pots[BFS][图搜] - it610.com 一 特别注意: 1. 每一种操作对应 ...

  3. 【枚举】【二分答案】【分块答案】【BFS】【最大流】【Dinic】bzoj1189 [HNOI2007]紧急疏散evacuate...

    [法一]枚举Time(0~N*M): S->'.'(1); 'D'->T(Time); '.'->'D'(dis(用BFS预处理,注意一旦到达'D',BFS就不能继续扩展了,注意di ...

  4. nyoj 284 坦克大战【bfs】

    坦克大战 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 Many of us had played the game "Battle city" i ...

  5. [kuangbin]专题二 搜索进阶 Escape HDU - 3533【BFS】

    [题目描述] The students of the HEU are maneuvering for their military training. The red army and the blu ...

  6. 【BFS】献给阿尔吉侬的花束(C++)

    [题目描述] 阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫.今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪.现在研究员们想 ...

  7. 【BFS】天棋哥哥大战AlphaGo 校OJ2395

    题目描述 3月15日,人机围棋大战巅峰对决在韩国首尔落下帷幕.五番棋的最后一局中,韩国著名棋手李世乭尽管与人工智能"AlphaGo"缠斗至官子阶段,但在双双进入读秒后最终还是投子认 ...

  8. 【bfs】WJ的逃离

    WJ(J)的逃离 题目大意: 有一个n×m的矩阵,*是不可走的,0是可走的,求1,1到n,m的最小转弯次数 原题: 题目描述 当WJ醒来时,发现自己被困在一个地图的左上角,幸好WJ有张图,并了解到出口 ...

  9. Bailian4129 变换的迷宫【BFS】

    4129:变换的迷宫 总时间限制: 1000ms 内存限制: 65536kB 描述 你现在身处一个R*C 的迷宫中,你的位置用"S" 表示,迷宫的出口用"E" ...

最新文章

  1. python批量合并csv_Python合并多个csv文件
  2. 后台给前台服务器控件添加样式
  3. c++11-decltype
  4. 前端学习(1674):前端系列实战课程之手风琴效果
  5. maven多模块项目部署到服务器,GitHub - baxias/foweb: 一个基于 Spring+SpringMVC+Mybatis 的Maven多模块项目。(实现前后端分离的服务器端)...
  6. 阿里巴巴大数据实践:大数据建设方法论OneData
  7. windows 10 ltsc 安装微软商店
  8. Cisco配置DHCP中继代理
  9. HttpMessageConverter 专题
  10. 1142 Maximal Clique
  11. 输出1000以内能被7整除又能被5整除的数
  12. 求解旅行商(货郎担)问题的五种方法
  13. 分布式学习(6)etcd@3@ API v3 gRPC_range,put,deleterange
  14. 初级SHELL脚本(如何书写一个CentOS7的更改单网卡IP的shell脚本)
  15. python网络爬虫学习(六)利用Pyspider+Phantomjs爬取淘宝模特图片
  16. 平塘天眼和大数据有什么关系_聊聊平塘“天眼”的那些事儿,“FAST”到底有多牛?...
  17. 程序员 10个 堪称神器的学习网站
  18. jsp+servlet学子商城项目--servlet、dao层的各项练习
  19. W800芯片平台进入OpenHarmony主干
  20. 分享一些JAVA相关资源

热门文章

  1. Arcgis Javascript那些事儿(五)--arcgis server发布自定义比例尺地图
  2. android recyclerview多布局_图文讲解RecyclerView的复用机制 ||Recyclerview进阶
  3. 【java学习之路】(java SE篇)005.面向对象基础入门part2
  4. Mongodb入门安装
  5. Android:沉浸式状态栏(一)工具类
  6. Zookeeper配置参数与节点值的解读
  7. Spark Streaming之Window Operations操作和解析
  8. java钓鱼_基于java的鱼友约钓鱼的系统
  9. 剑指offer面试题03. 数组中重复的数字(Array)
  10. caffe(4):mnist实例---手写数字识别