SHUOJ 1724 单侧跳马问题(BFS)

题目:SHUOJ 1724

题目链接:http://202.121.199.212/JudgeOnline/problem.php?id=1724

题目:

1724: 单侧跳马问题2

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 51   Solved: 32
[ Submit][ Status][ Web Board]

Description

给定m*n棋盘,求棋盘上一只马从一个位置(a,b)到达(c,d)位置的最短路径长。

注意在本问题中马只能向右侧走“日”字形的,但马不能向所在位置的左边走“日”字形。

Input

输入有若干测试数据。

每组测试数据有二行,第一行上有2个正整数m、n,表示一个m´n棋盘,(1<=m,n<=20);第二行上有4个整数a、b、c、d,之间用一个空格隔开,(a,b)表示棋盘上的马开始的行与列坐标,(c,d)表示到达的行与列坐标,(1<=a,c<=m,1<=b,d<=n)。输入直到文件结束。

Output

对输入中的每组测试数据,如果马能从位置(a,b)到达(c,d),那么输出马从位置(a,b)跳到位置(c,d)所需的最短路径长;如果不能跳到,那么直接输出“Impossible”。

Sample Input

8 8
5 5 8 8
15 19
1 6 9 18
10 6
1 1 10 6

Sample Output

2
8
Impossible


依旧是BFS,不废话,看代码。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;
const int maxn=10005;
int map[25][25];
int dir[4][2]={{-1,2},{-2,1},{2,1},{1,2}};
int m,n,a,b,c,d;
struct T{
    int x,y;
};
T sa,sb;
int bfs(int x,int y){
    queue<T> Q;
    sa.x=x;
    sa.y=y;
    map[x][y]=0;
    Q.push(sa);
    while(!Q.empty()){
        sa=Q.front();
        Q.pop();
        for(int i=0;i<4;i++){
            int xx=sa.x+dir[i][0];
            int yy=sa.y+dir[i][1];
            if(xx<=m && xx>=0 && yy<=n&& yy>=0){
                sb.x=xx;
                sb.y=yy;
                if(map[sa.x][sa.y]+1<map[xx][yy]){
                    map[xx][yy]=map[sa.x][sa.y]+1;
                    Q.push(sb);
                }
                  
            }
        }
    }
}
int main(){
    while(cin>>m>>n){
        for(int i=0;i<=m;i++)
            for(int j=0;j<=n;j++)
                map[i][j]=maxn;
        cin>>a>>b>>c>>d;
        bfs(a,b);
        if(map[c][d]==maxn){
            cout<<"Impossible"<<endl;
        }
        else
            cout<<map[c][d]<<endl;
    }
    return 0;
} 

好好学习~~~

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值