有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
时间: 2023-05-26 19:05:28 浏览: 135
这是一个经典的搜索问题,可以使用BFS(广度优先搜索)来解决。
具体的步骤如下:
1.定义一个结构体表示每个点的坐标和步数,定义一个队列存储已经访问过的点。
2.从起点开始,将起点入队,并将其步数设为0。
3.在每一轮循环中,从队列中取出一个点,判断它是否为终点,如果是,返回当前步数。
4.如果不是终点,则遍历所有可能的下一步位置(马可以向8个方向移动),如果下一步位置未超出棋盘范围且没有被访问过,将其入队并将其步数设为当前步数加1。
5.如果所有能到达的位置都已经被访问过,返回-1表示无法到达。
具体代码如下:
struct Point {
int x, y, step;
};
//定义8个方向
int dir[8][2] = {{-2,-1}, {-1,-2}, {1,-2}, {2,-1}, {2,1}, {1,2}, {-1,2}, {-2,1}};
int bfs(int sx, int sy, int ex, int ey, int n, int m) {
//定义一个二维数组表示是否被访问过
bool vis[n+1][m+1];
memset(vis, false, sizeof(vis));
//定义一个队列存储已经访问过的点
queue<Point> q;
//起点入队
q.push({sx, sy, 0});
vis[sx][sy] = true;
while(!q.empty()) {
//取出队列中的第一个点
Point cur = q.front();
q.pop();
//判断是否到达终点
if(cur.x == ex && cur.y == ey) {
return cur.step;
}
//遍历所有可能的下一步位置
for(int i=0; i<8; i++) {
int nx = cur.x + dir[i][0];
int ny = cur.y + dir[i][1];
//判断该位置是否在棋盘范围内且未被访问过
if(nx>=1 && nx<=n && ny>=1 && ny<=m && !vis[nx][ny]) {
q.push({nx, ny, cur.step+1});
vis[nx][ny] = true;
}
}
}
//如果所有能到达的位置都已经被访问过,返回-1
return -1;
}
int main() {
int n, m, sx, sy, ex, ey;
cin >> n >> m >> sx >> sy >> ex >> ey;
cout << bfs(sx, sy, ex, ey, n, m) << endl;
return 0;
}
阅读全文