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

时间限制1秒 内存限制64M

题目描述:

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

​   棋子的走法如图所示:

特殊的棋子(bfs)(北理16校赛)_第1张图片

如果棋子在图中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 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
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 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<


你可能感兴趣的:(搜索,北理16校赛,bfs)