e2 e4 a1 b2 b2 c3 a1 h8 a1 h7 h8 a1 b1 c3 f6 f6
To get from e2 to e4 takes 2 knight moves. To get from a1 to b2 takes 4 knight moves. To get from b2 to c3 takes 2 knight moves. To get from a1 to h8 takes 6 knight moves. To get from a1 to h7 takes 5 knight moves. To get from h8 to a1 takes 6 knight moves. To get from b1 to c3 takes 1 knight moves.To get from f6 to f6 takes 0 knight moves.
题意:象棋中悍马从起点到终点所需要走的最少步数
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <queue> using namespace std; char c1, c2; int n1, n2, n3, n4; int map[10][10]; int b[8][2] = {2,1,1,2,2,-1,1,-2,-1,-2,-2,-1,-2,1,-1,2}; int ans = 0; struct node { int x; int y; int step; }; int judge(int x, int y) { if ((x<1 || x>8) || (y<1 || y>8)) return 0; if (map[x][y]) return 0; return 1; } int bfs() { node cur, next; cur.x = n1; cur.y = n3; cur.step = 0; map[n1][n3] = 1; queue <node> q; q.push(cur); while (!q.empty()) { cur = q.front(); q.pop(); if (cur.x == n2 && cur.y == n4) return cur.step; for (int i = 0; i<8; i++) { next.x = cur.x + b[i][0]; next.y = cur.y + b[i][1]; if (next.x == n2 && next.y == n4) return cur.step+1; if (judge(next.x, next.y)) { next.step = cur.step + 1; map[next.x][next.y] = 1; q.push(next); } //cout << i<< endl; } } return -1; } int main() { while (cin >> c1>> n1 >> c2>> n2) { n3 = (int)c1-96; n4 = (int)c2-96; //cout << n3 << endl << n4 << endl; memset(map, 0, sizeof(map)); ans = bfs(); cout << "To get from "<<c1<< n1<<" to "<<c2<< n2<<" takes " << ans << " knight moves." << endl; } return 0; }