zoj 1091 knight moves (bfs)

题意:

马走日字,从一个点走到另一个点。


分析:


简单的bfs,卡了我很久。可以说第一个自己写的bfs。哈哈,在经过几次RE(悲剧啊)之后成功AC。

遇到的几个问题:

1.一开始,队列没有预先清空,导致上一次入队的下次还在。

2、也是最悲剧的,卡时间就卡在这里。定义源和目标是因为只有两个字母,所以只用了2个空间存取,后来改了很多还是re,无语了,最后略剽一眼代码发现了以前也碰到的问题会不会字符串‘\0'没有包含进去,结果还真是这样。想问题还是不完整啊。


#include <iostream>
#include <queue>
#include<cstdio>
using namespace std;
typedef struct point{
	int x,y;
	int moves;
}point;
queue<point>Q;
int e_x,e_y;
int map[10][10];
int dir[8][2]={{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2}};
int bfs(point s);
int main()
{
	char start[5],end[5];//'\0'.
	int s_x,s_y;
	int ans,i,j;
	point head;
	while(scanf("%s%s",start,end)!=EOF)
	{
		s_x=start[0]-'a'+1;
		s_y=start[1]-'0';
		e_x=end[0]-'a'+1;
		e_y=end[1]-'0';
		head.moves=0;
		head.x=s_x;
		head.y=s_y;
		while(!Q.empty ())
			Q.pop();//清空队列,上一次的队列还有的
		for(i=0;i<10;i++)
			for(j=0;j<10;j++)
				map[i][j]=0;
		ans=bfs(head);
		printf("To get from %s to %s takes %d knight moves.\n",start,end,ans);
	}
	return 0;
}
int bfs(point s)
{
	int j,x,y;
	point head,t;
	map[s.x][s.y]=1;
	Q.push (s);
	while(!Q.empty ())
	{
		head=Q.front ();
		Q.pop();
		if(head.x==e_x&&head.y==e_y) return head.moves;
		for(j=0;j<8;j++)
		{
			x=head.x+dir[j][0];
			y=head.y+dir[j][1];
			if(x>0&&x<=8&&y>0&&y<=8&&map[x][y]==0)
			{
				map[x][y]=1;
				t.x=x;
				t.y=y;
				t.moves=head.moves+1;
				Q.push(t);
			}
		}
	}
}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值