1. 程式人生 > 其它 >馬的遍歷

馬的遍歷

P1443 馬的遍歷

題目描述

有一個 n \times mn×m 的棋盤,在某個點 (x, y)(x,y) 上有一個馬,要求你計算出馬到達棋盤上任意一個點最少要走幾步。

輸入格式

輸入只有一行四個整數,分別為 n, m, x, yn,m,x,y。

輸出格式

一個 n \times mn×m 的矩陣,代表馬到達某個點最少要走幾步(左對齊,寬 55 格,不能到達則輸出 -11)。

輸入輸出樣例

輸入 #1
3 3 1 1
輸出 #1
0    3    2    
3    -1   1    
2    1    4    

說明/提示

資料規模與約定

對於全部的測試點,保證 1 \leq x \leq n \leq 4001xn400,1 \leq y \leq m \leq 4001ym400。

#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; } /* 用寬搜,根據馬的路徑一層層遍歷 */