Knight Moves(POJ1915)

Posted mjn1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Knight Moves(POJ1915)相关的知识,希望对你有一定的参考价值。

技术图片

 

 技术图片

 

 通过广搜, 向如图所示的8个方向搜索, 边搜索边记录步数, 最后若到达终点则返回当前走过的步数, 否则返回0

#include <iostream>
#include <queue>
#include <cstring>
using namespace std;

struct node

	int x, y;	// 当前点的坐标 
	int step;	// 当前走的步数
	node() 
	node(int x1, int y1):x(x1), y(y1)  
;

int n, l;
int map[310][310], vis[310][310];
int dir[8][2] = 2,1,1,2,-1,2,-2,1,-1,-2,-2,-1,1,-2,2,-1;
node s, e;

int bfs()

	queue<node> q;
	node p, t;
	int dx, dy;
	s.step = 0;
	vis[s.x][s.y] = 1;
	q.push(s);
	while(!q.empty())
	
		p = q.front();
		q.pop();
		
		if(p.x == e.x && p.y == e.y)	return p.step;
		
		for(int i = 0; i < 8; ++ i)
		
			dx = p.x + dir[i][0];
			dy = p.y + dir[i][1];
			
			if(dx < 0 || dx >= l || dy < 0 || dy >= l || vis[dx][dy])	
				continue;
				
			t = node(dx, dy);
			t.step = p.step + 1;
			vis[t.x][t.y] = 1;
			q.push(t);
		
	
	return 0;


int main()

	cin >> n;
	while(n --)
	
		memset(vis, 0, sizeof(vis));
		cin >> l;
		cin >> s.x >> s.y;
		cin >> e.x >> e.y;
		cout << bfs() << endl;
	
	
	return 0;


/*
Sample Input:
3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1

Sample Output:
5
28
0
*/

  

以上是关于Knight Moves(POJ1915)的主要内容,如果未能解决你的问题,请参考以下文章

poj 1915 Knight Moves 双向bfs

POJ 1915 Knight Moves(BFS+STL)

Knight Moves(POJ1915)

poj1915 Knight Moves(BFS)

POJ 1915--Knight Moves

POJ1915Knight Moves(单向BFS + 双向BFS)