特殊的棋子(bfs)(北理16校赛)

来源:互联网 发布:ubuntu中文语言包 apt 编辑:程序博客网 时间:2024/04/30 02:43
时间限制1秒 内存限制64M

题目描述:

         xc今天买到了一个非常大的棋盘,这个棋盘有nm列这么大。

​   棋子的走法如图所示:


如果棋子在图中A的位置,那么他在下一步可以移动到棋盘上所有深色的位置,即所有和他相邻的格子,以及斜向距离位2的格子。


每一次这样的移动视为走1步。

现在棋子在第a行第b列,xc想知道最快可以在多少步移动到第cd列?



输入格式:

   第一行2个正整数,nm。代表棋盘的大小(n,m<=100)

         第二行4个正整数,abcd,保证数据合法。


输出格式:

         输出一个整数独占一行,表示从第a行第b列出发,最快可以在多少步移动到c行d列。


样例输入:

         100 100

         1 1 10 10


样例输出:

         5


题目大意:

          给出了下一步能往哪里走,求出从起点走到终点最少走多少步

解题思路:

          裸的bfs,有12个方向,记录下来依次加入队列即可。

p.s.需要注意的是起点可能和终点相同,那么一开始从队列中pop出起点的时候就需要判断一下是不是终点,输出0,否则得到的是走出去又走回来的步数2,这容易wa一发


#include <iostream>#include <algorithm>#include <vector>#include <cstring>#include <cmath>#include <map>#include <queue>#include <string>#include <set>using namespace std;typedef long long ll;typedef unsigned long long ull;const int INF=0x3f3f3f3f;#define CLR0(a) (memset(a,0,sizeof(a)))#define CLR1(a) (memset(a,-1,sizeof(a)))#define CLRf(a) (memset(a,0x3f,sizeof(a)))const int maxn=0;const int maxm=0;int dx[]={1,-1,0,0,1,-1,-1,1,2,2,-2,-2};int dy[]={0,0,1,-1,1,-1,1,-1,2,-2,2,-2};int vis[128][128];struct node{int x,y,s;node(int xx,int yy,int ss){x=xx;y=yy;s=ss;}};int main(){int n,m;int a,b,c,d;while(cin>>n>>m){CLR0(vis);cin>>a>>b>>c>>d;queue<node> Q;while(!Q.empty())Q.pop();Q.push(node(a,b,0));vis[a][b]=1;int ans=0,f=0;while(!Q.empty()){int X=Q.front().x;int Y=Q.front().y;int S=Q.front().s;if(X==c&&Y==d){ans=S;f=1;break;}Q.pop();for(int k=0;k<12;k++){int tx=X+dx[k];int ty=Y+dy[k];if(tx==c&&ty==d){ans=S+1;f=1;break;}if(tx>=1 && tx<=n && ty>=1 && ty<=m && vis[tx][ty]==0){Q.push(node(tx,ty,S+1));vis[tx][ty]=1;}}if(f)break;} cout<<ans<<endl;}return 0;}


0 0
原创粉丝点击