BFS(5):P1443 马的遍历——类dijkstra搜索,路径搜索去重

mac2026-04-07  5

P1443 马的遍历

输入输出样例 输入 #1复制 3 3 1 1 输出 #1复制 0 3 2 3 -1 1 2 1 4

总结目录

1 本题搜索思路,搜索路径去重方法 2 本题特点

1 搜索思路与去重

本题中,搜索的是最短路径,因此用BFS没有问题。另外,这里去除重复搜索的方法类似于机器人搬运重物。都是通过判断是否能够更新最短路来防止重复的搜索。只是机器人搬运重物那里是机器人走的方向和步数的结合,而这里是马的遍历的方向不同,但是步数固定

2 本题特点

本题特点一个是马的走路方式比较特别,因此设置了8个方向。另外就是输出方式使用了printf"%-5d"来进行对齐。

代码

#include<iostream> #include<climits> #include<algorithm> #include<queue> #define maxsize 405 using namespace std; int mat[maxsize][maxsize]; int n, m; int srow, scol; int rowcol_change[][2] = { {-1,2},//上右 {-2,1}, {-1,-2},//上左 {-2,-1}, {2,1},//下右 {1,2}, {2,-1},//下左 {1,-2} }; struct node { int row; int col; int step; }; bool pace(node tmp, int k) { //判断tmp状态能否按照k方向前进 int nextrow = tmp.row + rowcol_change[k][0]; int nextcol = tmp.col + rowcol_change[k][1]; if (nextrow >= 1 && nextrow <= n&&nextcol >= 1 && nextcol <= m) {//越界判断 return true; } return false; } void bfs(int row, int col) { node start; start.row = row; start.col = col; start.step = 0; mat[row][col] = 0; queue<node> q; q.push(start); while (!q.empty()) { node tmp = q.front(); q.pop(); for (int i = 0; i < 8; i++) { if (pace(tmp, i)) {//如果当前方向可以到达那个点 int nextrow = tmp.row + rowcol_change[i][0]; int nextcol = tmp.col + rowcol_change[i][1]; if (tmp.step + 1 < mat[nextrow][nextcol]) {//如果这个走法可以更新 mat[nextrow][nextcol] = tmp.step + 1; node tmp2; tmp2.row = nextrow; tmp2.col = nextcol; tmp2.step = tmp.step + 1; q.push(tmp2); } } } } } void disp() { for (int row = 1; row <= n; row++) { for (int col = 1; col <= m; col++) { if (mat[row][col] == INT_MAX) { printf("%-5d", -1); } else { printf("%-5d", mat[row][col]); } } cout << endl; } } int main() { cin >> n >> m; cin >> srow >> scol; fill(mat[0], mat[0]+maxsize*maxsize, INT_MAX); bfs(srow, scol); disp(); return 0; }
最新回复(0)