题目链接
find a way
题意:
两个人找武器(武器有很多),问两人到达那一把武器上所需要的时间最短,最短时间是多少,每移动一步的消耗为11
思路
最短问题,bfs
从两人的起点各进行一次bfs
一个score数组,记录有武器的地方的二人消耗时间相加,mp数组记录是否走过此位置
易错点:
每次之前都要将数组重新赋值,初始化为0
最后求最小步数判断条件是,不能以该地方是否有武器判断,因为有武器不一定能走到比如
.#.
#@#
.#.
判断条件应该是以此处的score数组不为0判断
ac代码如下
#include<bits\stdc++.h>
using namespace std;
typedef struct path
{
int x;
int y;
int number;
} Path;
int mp[250][250];
int n, m;
int score[250][250];
char maze[250][250];
int dx[4] = {0, 0, -1, 1};
int dy[4] = {1, -1, 0, 0};
void bfs(int i, int j)
{
Path q;
q.x = i;
q.y = j;
q.number = 0;
queue<Path> paths;
paths.push(q);
while (!paths.empty())
{
Path fr = paths.front();
paths.pop();
mp[fr.x][fr.y] = -1;
for (int i = 0; i < 4; i++)
{
if (fr.x + dx[i] >= 0 && fr.x + dx[i] < n && fr.y + dy[i] >= 0 && fr.y + dy[i] < m && maze[fr.x + dx[i]][fr.y + dy[i]] != '#' && mp[fr.x + dx[i]][fr.y + dy[i]] != -1)
{
Path type;
type.x = fr.x + dx[i];
type.y = fr.y + dy[i];
type.number = fr.number + 1;
paths.push(type);
if (maze[type.x][type.y] == '@')
{
score[type.x][type.y] += type.number;
}
mp[type.x][type.y] = -1;
}
}
}
}
int main()
{
while (cin >> n >> m)
{
getchar();
int x1, x2, y1, y2;
memset(score, 0, sizeof(score));
memset(maze, 0, sizeof(maze));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> maze[i][j];
if (maze[i][j] == 'Y')
{
x1 = i;
y1 = j;
}
if (maze[i][j] == 'M')
{
x2 = i;
y2 = j;
}
}
}
memset(mp, 0, sizeof(mp));
bfs(x1, y1);
memset(mp, 0, sizeof(mp));
bfs(x2, y2);
int mins = 10000;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (score[i][j])
mins = min(mins, score[i][j]);
}
}
cout << mins * 11 << endl;
}
return 0;
}