poj 1915 Knight Moves

poj   1915   Knight Moves                     题目链接:http://poj.org/problem?id=1915


题目大意:象棋里马走日,此题中给出棋盘大小,给出马的起止位置,问马跳过去最少要跳多少步。

题目分析:简单BFS,与以前稍有不同之处在dir数组。

code:

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int n,dir[8][2]={1,2,-1,2,2,1,2,-1,1,-2,-2,-1,-1,-2,-2,1};
char g[510][510];
struct node
{
	int x,y,step;
};
bool judge(int x,int y)
{
	return x<n&&y<n&&x>=0&&y>=0&&g[x][y]==0;
}
int bfs(int x,int y,int ex,int ey)
{
	queue<node>q;
	node first,next;
	first.x=x,first.y=y,first.step=0;
	q.push(first);
	while(!q.empty())
	{
		first=q.front();
		if(first.x==ex&&first.y==ey)return first.step;
		q.pop();
		g[first.x][first.y]=1;
		for(int i=0;i<8;i++)
		{
			next.x=first.x+dir[i][0];
			next.y=first.y+dir[i][1];
			if(judge(next.x,next.y))
			{
				next.step=first.step+1;
				q.push(next);
				if(next.x==ex&&next.y==ey)return next.step;
				g[next.x][next.y]=1;
			}
		}
	}
	return -1;//*
}
int main()
{
	int i,j,t,sx,sy,ex,ey;
	scanf("%d",&t);
	while(t--)
	{
		memset(g,0,sizeof(g));
		scanf("%d%d%d%d%d",&n,&sx,&sy,&ex,&ey);
		printf("%d\n",bfs(sx,sy,ex,ey));
	}
	return 0;
}
PS:好惨啊,又被虐了…… 哭这次是怎么回事呢?问题出在注释星号的那里,一开始那一行没写,本来以为不可能走到那里,所以不用控制那种情况,从discuss里找到数据后发现一个极尽坑跌的情况,说好的 (4 <= l <= 300)呢!?l居然可能是2,不加控制的结果就是随机数,然后就华丽的错了。那一行返回的值写0也可以,亲测。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
POJ1915是一道经典的搜索题目,也被称为“Knight Moves”。下面我将为您提供解题思路和解题步骤: 1. 题目描述 在8x8的国际象棋棋盘上,棋子“马”从初始位置出发,允许走日字形的移动。给定目标位置,求出从初始位置到目标位置最少需要几步。 2. 解题思路 这道题目可以采用广度优先搜索(BFS)算法解决。将初始位置加入队列中,然后依次处理队列中的每个位置,根据“马”的走法,生成下一步可以到达的位置,如果这个位置没有被访问过,则将其加入队列中,并记录到达这个位置的步数。 3. 解题步骤 具体的解题步骤如下: (1)将初始位置加入队列中,并记录步数为0。 (2)依次处理队列中的每个位置,生成下一步可以到达的位置。 (3)如果下一步可以到达的位置没有被访问过,则将其加入队列中,并记录到达这个位置的步数为当前位置的步数+1。 (4)重复步骤(2)和(3),直到队列为空。 (5)如果目标位置被访问过,则返回到达目标位置的步数,否则返回-1。 4. 注意事项 在实现BFS算法的过程中,需要注意以下几点: (1)需要记录每个位置是否被访问过,以避免重复访问。 (2)需要注意边界条件,防止数组越界。 (3)需要注意判断目标位置是否合法,即是否在棋盘范围内。 5. 总结 本题是一道经典的搜索题目,采用BFS算法可以求解出从初始位置到目标位置最少需要几步。在解题过程中,需要注意边界条件和目标位置是否合法等问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值