就是马走‘日’字形,然后输出到各个位置的最短路径,走不到就输出-1
直接用BFS搜索即可求解,但是输出方面有点问题,我一开始用printf("%-5d)全部WA,结果改成cout<<left<<setw(5);又能AC
不知道是什么问题,题解里面也有人用printf
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; const int INF = -1; int n, m; int sx, sy; int maze[500][500]; int d[500][500]; int dx[8] = {-1, -2, -2, -1, 1, 2, 2, 1}, dy[8] = {-2, -1, 1, 2, 2, 1, -1, -2}; void bfs(int x, int y){ queue< pair<int, int> > q; q.push( pair<int, int>(x, y) ); d[x][y] = 0; while( !q.empty() ){ pair<int, int> t = q.front(); q.pop(); for(int i=0; i<8; i++){ int nx = t.first + dx[i]; int ny = t.second + dy[i]; if(nx >= 0 && nx < n && ny >= 0 && ny < m && d[nx][ny] == INF){ d[nx][ny] = d[t.first][t.second] + 1; q.push( pair<int, int>(nx, ny) ); } } } } int main(){ ios::sync_with_stdio(false); cin >> n >> m >> sx >> sy; memset(d, INF, sizeof d); bfs(sx-1, sy-1); for(int i=0; i<n; i++){ for(int j=0; j<m; j++) cout<<left<<setw(5)<<d[i][j]; cout << endl; } return 0; }