您的位置:首页 > 其它

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];

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: