题目: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;
}
好好学习~~~