1413: 【作】【基础】骑士巡游

内存限制:128 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:7 解决:6

题目描述

马在中国象棋以日字形规则移动,给定n*m大小的棋盘,以及马的初始位置(x,y)和目标位置(s,t),

要求不能重复经过棋盘上的同一个点,计算马至少走多少步可以到达目标位置,所有棋盘保证从初始位置到结束位置一定有路径可达。

输入

测试数据包含一行,为六个整数,分别为棋盘的大小以及初始位置坐标n、m、x、y、s、t。(1≤x,s≤n≤5,1≤y,t≤m≤5)

输出

包含一行,为一个整数,表示马能到达目标位置的最小步数。

样例输入 复制

3 3 1 1 1 3

样例输出 复制

2

提示

#include<bits/stdc++.h>
using namespace std;
#define MAXN 10
struct coord {
    int x,y;
};
queue<coord> Q;
int dep[MAXN][MAXN];
bool vis[MAXN][MAXN];
int dx[9]={0,2,1,-1,1,-2,2,-2,-1};
int dy[9]={0,1,2,2,-2,1,-1,-1,-2};
int n,m,sx,sy,ex,ey;
void bfs(int sx,int sy){
    coord tmp = {sx,sy};
    Q.push(tmp);
    vis[sx][sy]=1;
    dep[sx][sy] = 0;
    while(!Q.empty()){
        coord u=Q.front();
        int x=u.x,y=u.y;
        Q.pop();
        for(int i=0;i<8;i++){
            int tx=x+dx[i],ty=y+ dy[i];
            if (tx>=1&&tx<=n&&ty>=1&&ty<=m&&vis[tx][ty]!=1){
                dep[tx][ty]=dep[x][y]+1;
            	coord tmp={tx,ty};
            	Q.push(tmp);       
            	vis[tx][ty]=1;
			}

       }
    }	
}
int main(){
	memset(dep,-1,sizeof(dep));
	cin>>n>>m>>sx>>sy>>ex>>ey; 
	bfs(sx,sy);
    cout<<dep[ex][ey];
	return 0;
}