习题6-4 骑士的移动(Knight Moves,UVa 439)

Posted As_zyh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了习题6-4 骑士的移动(Knight Moves,UVa 439)相关的知识,希望对你有一定的参考价值。

题目描述:

        输入标准8*8国际象棋上的两个格子(列用a ~ h表示,行用1 ~ 8表示),求马最少需要多少步从起点跳到终点。

AC代码:

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

struct Node {
	int r;
	char c;
	Node(int r=0, char c='a'):r(r),c(c) {}
};

const int MAX_N = 10;
char s1[10], s2[10];
char c1, c2;
int r1, r2;

int dc[] = {-1, -2, -2, -1, 1, 2, 2, 1};
int dr[] = {-2, -1, 1, 2, 2, 1, -1, -2};
int d[MAX_N][MAX_N];
int vis[MAX_N][MAX_N];

void bfs(int r, char c) {
	queue<Node> q;
	q.push(Node(r1, c1));
	d[r][c-'a'] = 0;
	vis[r][c-'a'] = true;
	
	while(!q.empty()) {
		Node u = q.front(); q.pop();
		for(int i = 0; i < 8; i++) {
			Node v(u.r+dr[i], u.c+dc[i]);
			if(vis[v.r][v.c-'a']) continue;
			if(v.r<1 || v.r > 8 || v.c<'a' || v.c>'h') continue;
			vis[v.r][v.c-'a'] = true;
			d[v.r][v.c-'a'] = d[u.r][u.c-'a'] + 1;
			q.push(v);
		}
	}
}

int main() {
	#ifdef LOCAL
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
	#endif
	while(scanf("%s%s", s1, s2) == 2) {
		r1=s1[1]-'0'; c1=s1[0];
		r2=s2[1]-'0'; c2=s2[0];
		memset(d, -1, sizeof(d));
		memset(vis, 0, sizeof(vis));
		bfs(r1, c1);
		printf("To get from %c%d to %c%d takes %d knight moves.\\n", c1, r1, c2, r2, d[r2][c2-'a']);
	}
	return 0;
}

以上是关于习题6-4 骑士的移动(Knight Moves,UVa 439)的主要内容,如果未能解决你的问题,请参考以下文章

uva 439 Knight Moves 骑士移动

Knight Moves (双向bfs)

Knight Moves

Knight Moves

HDU 1372 Knight Moves(bfs)

HDU - 1372 Knight Moves(bfs入门)