题目:SHUOJ-1659
题目链接:http://202.121.199.212/JudgeOnline/problem.php?id=1659
题目:
给定8*8方格棋盘,求棋盘上一只马从一个位置到达另一位置的最短路径长。
注意马是走“日”形的。
输入有若干测试数据。
每组测试数据仅1行,每行上有2个方格pos1、pos2,之间用一个空格隔开,每格方格表示棋盘上的一个位置,该位置由表示列的1个字母(a-h)及表示行的一个数字(1-8)构成,如“d7”表示第4列第7行。
对输入中每行上的2个方格pos1、pos2,输出马从位置pos1跳到pos2所需的最短路径长。如“a1==>a2: 3 moves”表示从位置a1跳到a2所需的最少步数是3。
注意:按输出样例所示格式输出,如“a1==>a2: 3 moves”中冒号后有一个空格,再跟着所需的最少步数。
经典的BFS,题目本身也没有什么好说的,只是要跳8个方向,和之后的几个单侧跳马问题是同一类的,全部用BFS来求最短路,注意字母转化成数字。
额,什么?BFS不会=-=,那你会了再来看吧,建议移步BFS第一篇博客有讲原理~
什么?SHUOJ是什么鬼没听说过?这是我们学校的OJ(捂脸),虽说不怎么样,但有些题目还是值得一做的=-=
上代码:
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #include<queue> using namespace std; const int maxn=10005; int map[10][10]; int dir[8][2]={{-1,2},{-2,1},{2,1},{1,2},{-1,-2},{-2,-1},{2,-1},{1,-2}}; char aa,cc; int a,b,c,d; struct T{ int x,y; }; T sa,sb; //我也觉得我变量名字起的好,2333 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<8;i++){ int xx=sa.x+dir[i][0]; int yy=sa.y+dir[i][1]; if(xx<=8 && xx>=1 && yy<=8&& yy>=1){ 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>>aa>>b>>cc>>d){ for(int i=0;i<=9;i++) for(int j=0;j<=9;j++) map[i][j]=maxn; a=aa-'a'+1; c=cc-'a'+1; bfs(a,b); cout<<aa<<b<<"==>"<<cc<<d<<": "<<map[c][d]<<" moves"<<endl; } return 0; }