馬的遍歷
阿新 • • 發佈:2022-03-18
P1443 馬的遍歷
題目描述
有一個 n \times mn×m 的棋盤,在某個點 (x, y)(x,y) 上有一個馬,要求你計算出馬到達棋盤上任意一個點最少要走幾步。
輸入格式
輸入只有一行四個整數,分別為 n, m, x, yn,m,x,y。
輸出格式
一個 n \times mn×m 的矩陣,代表馬到達某個點最少要走幾步(左對齊,寬 55 格,不能到達則輸出 -1−1)。
輸入輸出樣例
輸入 #13 3 1 1輸出 #1
0 3 2 3 -1 1 2 1 4
說明/提示
資料規模與約定
對於全部的測試點,保證 1 \leq x \leq n \leq 4001≤x≤n≤400,1 \leq y \leq m \leq 4001≤y≤m≤400。
#include<iostream> #include<cstring> #include<queue> using namespace std; typedef pair<int,int> PAII; const int N=500; int d[N][N],g[N][N]; int dx[8]={1,1,-1,-1,2,2,-2,-2}; int dy[8]={2,-2,2,-2,1,-1,1,-1}; bool st[N]; int n,m; int bfs(int x,int y){ memset(d,-1,sizeof(d)); queue<PAII> q; q.push({x,y}); d[x][y]=0; while(q.size()) { auto t=q.front(); q.pop(); for(int i=0;i<8;i++) { int a=t.first+dx[i],b=t.second+dy[i]; if(a>0&&b>0&&a<=n&&b<=m&&d[a][b]==-1) { d[a][b]=d[t.first][t.second]+1; q.push({a,b}); } } } } int main(){ int x,y; cin>>n>>m>>x>>y; bfs(x,y); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { printf("%-5d",d[i][j]); } cout<<endl; } return 0; } /* 用寬搜,根據馬的路徑一層層遍歷 */