Cxt出发了,他要去找时光机,可是距离好远,因为他生存在远古时期,木有轮船,飞机,大炮什么的。于是只能回去= =。地图是一个矩形,可以划分成M×N个方格。一些格子是岩石,还有一些沼泽,其余的只是美丽、纯净、湛蓝的水,因为Cxt不会游泳= =。Cxt每次站在一块岩石上想跳到另一块岩石上,他只能从一块岩石跳到另一块岩石上,既不能跳到水里也不能跳到沼泽里。因为Cxt有惊人的弹跳能力,他的跳法很像象棋中的马步:每次跳跃可以横移M1格,纵移M2格,或纵移M1格,横移M2格,最多有八个方向可供移动选择。请计算cx到达终点的最小步数输入数据保证终点是一定可达的. Input Format 第一行四个用空格分开的整数:M,N,M1和M2,1≤M,N≤30,1≤M1≤30,1≤M2≤30,M1≠M2 第二行到M+1行:第i+1行有N个用空格分开的整数描述了池塘第行的状态0为水,1为岩石,2为沼泽,3为起点4为终点。 Output Format第一行:从起点到终点的最少步数 Sample Input 4 5 1 2 1 0 1 0 1 3 0 2 0 4 0 1 2 0 0 0 0 0 1 0 Sample Output 2 数据说明 先跳到1行3列的岩石上,再跳到终点需要2步 时空磁盘限制(运行时) 时间限制:2000ms C++实现
时间: 2024-01-04 19:03:36 浏览: 72
cxt编辑器 v1.0免费版
以下是C++的实现代码,使用了广度优先搜索算法:
```cpp
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int MAXN = 35;
const int MAXM = 35;
const int MAX_DIRECTION = 8;
const int INF = 0x3f3f3f3f;
int n, m, m1, m2;
int map[MAXN][MAXM];
int dist[MAXN][MAXM]; // 记录起点到每个点的最短距离
bool vis[MAXN][MAXM]; // 记录每个点是否已经被访问过
struct Point {
int x, y;
};
// 确定每个点可以移动到的位置
vector<Point> getNextPoints(Point p) {
vector<Point> nextPoints;
int x = p.x, y = p.y;
int dx[8] = {m1, m1, -m1, -m1, m2, m2, -m2, -m2};
int dy[8] = {m2, -m2, m2, -m2, m1, -m1, m1, -m1};
for (int i = 0; i < MAX_DIRECTION; i++) {
int nx = x + dx[i], ny = y + dy[i];
if (nx >= 0 && nx < n && ny >= 0 && ny < m && map[nx][ny] != 0) {
nextPoints.push_back({nx, ny});
}
}
return nextPoints;
}
int bfs(Point start, Point end) {
// 初始化
memset(dist, INF, sizeof(dist));
memset(vis, 0, sizeof(vis));
queue<Point> q;
q.push(start);
dist[start.x][start.y] = 0;
vis[start.x][start.y] = true;
while (!q.empty()) {
Point cur = q.front();
q.pop();
if (cur.x == end.x && cur.y == end.y) {
return dist[cur.x][cur.y];
}
vector<Point> nextPoints = getNextPoints(cur);
for (int i = 0; i < nextPoints.size(); i++) {
Point next = nextPoints[i];
if (!vis[next.x][next.y]) {
vis[next.x][next.y] = true;
dist[next.x][next.y] = dist[cur.x][cur.y] + 1;
q.push(next);
}
}
}
return -1; // 无法到达终点
}
int main() {
// 输入地图
cin >> n >> m >> m1 >> m2;
Point start, end;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> map[i][j];
if (map[i][j] == 3) {
start = {i, j};
} else if (map[i][j] == 4) {
end = {i, j};
}
}
}
// 计算最短距离
int ans = bfs(start, end);
cout << ans << endl;
return 0;
}
```
阅读全文