POJ 1915 Knigth Moves

17 篇文章 0 订阅

Knight Moves

在棋盘上从某个点出发以最短的距离到达另一个点。直接用BFS。代码如下:

#include<stdio.h>
#include<string.h>
#include<queue>

using namespace std ;

struct Node{
	int x ;
	int y ;
	int s ;
};

int n ;
int l ;

int map[305][305] ;
int dir[][2] ={{-1,2} ,{1,2} ,{2,1} , {2,-1} , 
{1,-2} ,{-1,-2} ,{-2 ,-1},{-2 , 1}} ;

void bfs(int sx , int sy , int ex , int ey){
	
	queue<Node> Q ;
	Node a ;
	Node b ;
	a.x = sx ;
	a.y = sy ;
	a.s = 0  ;
	map[sx][sy] = 1 ;
	Q.push(a) ;
	
	while(!Q.empty()){
		b = Q.front() ;
		
		if(b.x == ex && b.y == ey){
			printf("%d\n" , b.s) ;
		}
		
		Q.pop() ;
		
		for(int i = 0 ; i < 8 ; i ++){
			if(b.x + dir[i][0] >= 0 && b.x + dir[i][0] < l && b.y + dir[i][1] >= 0 && b.y + dir[i][1] < l){
				Node c ;
				
				c.x = b.x + dir[i][0] ;
				c.y = b.y + dir[i][1] ;
				c.s = b.s + 1 ;
				if(!map[c.x][c.y]){
					Q.push(c) ;	
					map[c.x][c.y] = 1 ;
				}
			}
		}
	}
}

void work(){
	scanf("%d" , &l) ;
	
	int sx ;
	int sy ;
	int ex ;
	int ey ;
	
	scanf("%d %d" , &sx , &sy) ;
	scanf("%d %d" , &ex , &ey) ;
	memset(map , 0 , sizeof(map)) ;
	
	bfs(sx , sy , ex , ey) ;
}
int main(){
	
	scanf("%d" , &n) ;
	while(n--){
		work() ;
	}
	
	return 0 ;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值