您的位置:首页 > 其它

uva 439骑士的移动(图的最短路 bfs)

2015-05-11 20:57 483 查看

题目:给出国际象棋棋盘中的两个点,求马从一个点跳到另一个点的最少步数。

思路见码:

#include<cstdio>  
#include<cstring>  
#include<cmath>  
#include<cstdlib>  
#include<iostream>  
#include<algorithm>  
#include<vector>  
#include<map>  
#include<queue>  
#include<stack> 
#include<string>
#include<map> 
#include<set>
using namespace std;  
#define LL long long  
const int maxn=64+5;

int dirx[]={2,1,-1,-2,-2,-1,1,2};
int diry[]={-1,-2,-2,-1,1,2,2,1};
int vis[maxn],dist[maxn];

void bfs(int beg,int end){
	int ok=0;
	
	queue<int> q;
	q.push(beg);vis[beg]=1;dist[beg]=0;
	
	while(!q.empty()&&!ok){
		int tmp=q.front();q.pop();
		int tmpx=(tmp-1)/8+1,tmpy=(tmp-1)%8+1;
		
		for(int i=0;i<8;i++){
			int pushx=tmpx+dirx[i],pushy=tmpy+diry[i];
			int pushv=(pushx-1)*8+pushy;
			if(pushx<=0||pushx>8||pushy<=0||pushy>8||vis[pushv]) continue;
			
			//printf("%d\n",pushv);
			q.push(pushv);
			vis[pushv]=1;dist[pushv]=dist[tmp]+1;
			
			if(pushv==end){ok=1;break;}
		}
	}
}

int main(){
	//freopen("input.txt","r",stdin);
	
	char begy,endy;
	int begx,endx;
	while(scanf("%c%d",&begy,&begx)!=EOF){
		memset(vis,0,sizeof(vis));
		getchar();
		scanf("%c%d",&endy,&endx);
		int nbegy=begy-'a'+1;
		int nendy=endy-'a'+1;
		//printf("%d %d\n",endx,nendy);
		int beg=(begx-1)*8+nbegy,end=(endx-1)*8+nendy;
		
		//printf("%d %d\n",beg,end);
		bfs(beg,end);
		
		printf("To get from %c%d to %c%d takes %d knight moves.\n",begy,begx,endy,endx,dist[end]);
		getchar();
		//getchar();
	}
	//for(int i=0;i<8;i++) printf("%d\n",dirx[i]);
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: