UVa 439 Knight Moves

本文介绍了一种使用BFS算法解决骑士在国际象棋盘上从一个位置走到另一个位置的问题。通过队列实现层序遍历,并利用set进行状态判重,确保了搜索路径的正确性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BFS可以想成树的层序遍历,关键是1)判重,表示偷懒用set判重;

 2)判断搜索到第几层,用front表示当前层数,rear表示上一层层数。

#include<iostream>
#include<cstring>
#include<set>
#include<cstdio>
#include<queue>
#include<cctype>
using namespace std;
set<string> st;
char s1[5],s2[5];
const int dx[]={2,1,-1,-2,-2,-1, 1, 2};
const int dy[]={1,2, 2, 1,-1,-2,-2,-1};
int d[10000];
bool inside(char x,char y)
{
	return x>='a'&&x<='h'&&y>='1'&&y<='8';
}
bool check(char* A)
{
	string s=A;             //直接st.count(A)会RunTime Error不知道为什么
	if(st.count(s)) return false;
	st.insert(s);
	return true;
}
int bfs()
{
	queue<char*> p;
	p.push(s1);
	int cnt=0;
	memset(d,0,sizeof(d));
	int front=1,rear=0;
	while(!p.empty())
	{
		char *p1=p.front();p.pop();
		if(!strcmp(p1,s2)) return rear;
		for(int i=0;i<8;i++)
		{
			char* p2=new char[5];
			p2[0]=p1[0]+dx[i];
			p2[1]=p1[1]+dy[i];
			p2[2]='\0';           //一定要加
			if(inside(p2[0],p2[1])&&check(p2))
			{
				d[front++]=d[rear]+1;
				p.push(p2);
			}
		}
		rear++;    //进入下一层
	}
	return -1;
}
int main()
{
	while(scanf("%s",s1)!=EOF&&scanf("%s",s2))
	{
		st.clear();
		printf("To get from %s to %s takes %d knight moves.\n",s1,s2,d[bfs()]);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值