Aoj 0558
2015-12-02 21:45
295 查看
Aoj 0558 点击打开链接
题意:H * W的地图上有N个奶酪工厂,分别生产硬度为1-N的奶酪。老鼠准备从老鼠洞出发吃遍每一个工厂的奶酪。老鼠有一个体力值,初始时为1,每吃一个工厂的奶酪体力值增加1(每个工厂只能吃一次),且老鼠只能吃硬度不大于当前体力值的奶酪。
老鼠从当前格走到相邻的无障碍物的格(东南西北)需要时间1单位,有障碍物的格不能走。走到工厂上时即可吃到该工厂的奶酪,吃奶酪时间不计。问吃遍所有奶酪最少用时。
输入:第一行三个整数H(1 <= H <= 1000)、W(1 <= W <=1000)、N(1 <= N <= 9),之后H行W列为地图, “.“为空地, ”X“为障碍物,”S“为老鼠洞, 1-N代表硬度为1-N的奶酪的工厂。
参考:点击打开链接
这是一个宽度优先搜索的题目(BFS),我们用一个数组去记录障碍物的x和y
假如:有3个障碍物,我们分别算S(老鼠洞)到第一个障碍物的最短距离,第一个障碍物和第二个障碍物的最短距离,
第二个障碍物与第三个障碍物的最短距离,然后将三个距离相加,就是吃遍所有奶酪的最少时间,这就要用到BFS了
每回调用BFS(n.x, n.y, n+1.x, n+1.y)来算最短距离
代码如下:
#include <iostream>
#include <queue>
const int MAX_H = 1000;
const int MAX_W = 1000;
const int INF = 100000000;
using namespace std;
typedef pair<int, int> P;
char cheese[MAX_H][MAX_W] = {0}; // 输入字符
int r[MAX_H][MAX_W]; // 记录
int H = 0, W = 0, N = 0; // H:x W:y N:奶酪个数
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
// 方向向量
int factor[11][2];
int bfs(int &sx, int &sy, int &gx, int &gy);
// BFS函数
int main()
{
cin >> H >> W >> N;
for(int i=0; i<H; i++)
{
for(int j=0; j<W; j++)
{
cin >> cheese[i][j];
if('S' == cheese[i][j])
{
factor[0][0] = i;
factor[0][1] = j;
cheese[i][j] = '.';
}
if(isdigit(cheese[i][j]))
// isdigit是判断字符串中是否有0-9的字符
{
int index = cheese[i][j] - '0'; // 将数字的字符变为整数
factor[index][0] = i;
factor[index][1] = j;
}
}
}
int step = 0;
for(int i=0; i<N; i++)
{
step += bfs(factor[i][0], factor[i][1], factor[i+1][0], factor[i+1][1]); // 调用bfs并进行相加
}
cout << step << endl;
return 0;
}
int bfs(int &sx, int &sy, int &gx, int &gy)
{
// 初始化一个队列
P p;
queue<P> que;
for(int i=0; i<H; i++)
{
for(int j=0; j<W; j++)
{
r[i][j] = INF;
}
}
que.push(P(sx,sy));
r[sx][sy] = 0;
// 初始
while(que.size())
{
p = que.front();
que.pop();
if(p.first == gx && p.second == gy)
{
break;
}
// 方向向量
for(int i=0; i<4; i++)
{
int xn = p.first + dx[i];
int yn = p.second + dy[i];
if(xn >= 0 && xn < H && yn >= 0 && yn < W && cheese[xn][yn]!='X' && r[xn][yn] == INF )
{
que.push(P(xn,yn));
r[xn][yn] = r[p.first][p.second] + 1;
}
}
}
return r[gx][gy];
}
题意:H * W的地图上有N个奶酪工厂,分别生产硬度为1-N的奶酪。老鼠准备从老鼠洞出发吃遍每一个工厂的奶酪。老鼠有一个体力值,初始时为1,每吃一个工厂的奶酪体力值增加1(每个工厂只能吃一次),且老鼠只能吃硬度不大于当前体力值的奶酪。
老鼠从当前格走到相邻的无障碍物的格(东南西北)需要时间1单位,有障碍物的格不能走。走到工厂上时即可吃到该工厂的奶酪,吃奶酪时间不计。问吃遍所有奶酪最少用时。
输入:第一行三个整数H(1 <= H <= 1000)、W(1 <= W <=1000)、N(1 <= N <= 9),之后H行W列为地图, “.“为空地, ”X“为障碍物,”S“为老鼠洞, 1-N代表硬度为1-N的奶酪的工厂。
参考:点击打开链接
这是一个宽度优先搜索的题目(BFS),我们用一个数组去记录障碍物的x和y
假如:有3个障碍物,我们分别算S(老鼠洞)到第一个障碍物的最短距离,第一个障碍物和第二个障碍物的最短距离,
第二个障碍物与第三个障碍物的最短距离,然后将三个距离相加,就是吃遍所有奶酪的最少时间,这就要用到BFS了
每回调用BFS(n.x, n.y, n+1.x, n+1.y)来算最短距离
代码如下:
#include <iostream>
#include <queue>
const int MAX_H = 1000;
const int MAX_W = 1000;
const int INF = 100000000;
using namespace std;
typedef pair<int, int> P;
char cheese[MAX_H][MAX_W] = {0}; // 输入字符
int r[MAX_H][MAX_W]; // 记录
int H = 0, W = 0, N = 0; // H:x W:y N:奶酪个数
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
// 方向向量
int factor[11][2];
int bfs(int &sx, int &sy, int &gx, int &gy);
// BFS函数
int main()
{
cin >> H >> W >> N;
for(int i=0; i<H; i++)
{
for(int j=0; j<W; j++)
{
cin >> cheese[i][j];
if('S' == cheese[i][j])
{
factor[0][0] = i;
factor[0][1] = j;
cheese[i][j] = '.';
}
if(isdigit(cheese[i][j]))
// isdigit是判断字符串中是否有0-9的字符
{
int index = cheese[i][j] - '0'; // 将数字的字符变为整数
factor[index][0] = i;
factor[index][1] = j;
}
}
}
int step = 0;
for(int i=0; i<N; i++)
{
step += bfs(factor[i][0], factor[i][1], factor[i+1][0], factor[i+1][1]); // 调用bfs并进行相加
}
cout << step << endl;
return 0;
}
int bfs(int &sx, int &sy, int &gx, int &gy)
{
// 初始化一个队列
P p;
queue<P> que;
for(int i=0; i<H; i++)
{
for(int j=0; j<W; j++)
{
r[i][j] = INF;
}
}
que.push(P(sx,sy));
r[sx][sy] = 0;
// 初始
while(que.size())
{
p = que.front();
que.pop();
if(p.first == gx && p.second == gy)
{
break;
}
// 方向向量
for(int i=0; i<4; i++)
{
int xn = p.first + dx[i];
int yn = p.second + dy[i];
if(xn >= 0 && xn < H && yn >= 0 && yn < W && cheese[xn][yn]!='X' && r[xn][yn] == INF )
{
que.push(P(xn,yn));
r[xn][yn] = r[p.first][p.second] + 1;
}
}
}
return r[gx][gy];
}
相关文章推荐
- 类的封装
- ecshop后台支付方式的报错(2)
- linux增加vlan网卡配置
- 配置(更改)tomcat的端口
- CDH5.1使用CDH Manager安装
- 1027. 打印沙漏(20)
- html/css
- ecshop后台支付方式的报错(1)
- OpenCV入门:(三:图片Mask operations)
- ios面试题(2)
- Eclipse Project 无故消失的解决办法
- Linux下C++的编程——开偏介绍
- arm-linux内核启动学习笔记(一)
- LeetCode-Remove Duplicates from Sorted List II
- 关于ECSHOP模板架设的服务器php版本过高报错的解决
- Base64
- node js 调试
- 可删除的对象
- (二十七)整型字面值(常量)——多种进制
- 博弈论基础知识: 巴什博奕+威佐夫博奕+尼姆博弈(及Staircase