“骑士漫游”的问题大意如下:
在8*8的棋盘方格上,一个骑士可以自由移动(移动方法为走L形,即横着走两格然后竖着走一格,或是竖着走两格然后横着走一格)。骑士可以从棋盘上任一个方格出发,在64(8*8=64)步内是否可以漫游整个棋盘,每个方格都走到并且只走一次。
用一个初始化为0的8*8的二维数组来代表棋盘:
0 1 2 3 4 5 6 7
0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0
2 0 0 8 0 7 0 0 0
3 0 5 0 0 0 1 0 0
4 0 0 0 k 0 0 0 0
5 0 6 0 0 0 2 0 0
6 0 0 4 0 3 0 0 0
7 0 0 0 0 0 0 0 0
在8*8的棋盘方格上,一个骑士可以自由移动(移动方法为走L形,即横着走两格然后竖着走一格,或是竖着走两格然后横着走一格)。骑士可以从棋盘上任一个方格出发,在64(8*8=64)步内是否可以漫游整个棋盘,每个方格都走到并且只走一次。
用一个初始化为0的8*8的二维数组来代表棋盘:
0 1 2 3 4 5 6 7
0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0
2 0 0 8 0 7 0 0 0
3 0 5 0 0 0 1 0 0
4 0 0 0 k 0 0 0 0
5 0 6 0 0 0 2 0 0
6 0 0 4 0 3 0 0 0
7 0 0 0 0 0 0 0 0
k代表起始点,1--8代表骑士可能的8种走法。
#include<iostream>
#include<string.h>
using namespace std;
int g[8][8];
int q[100];
int step[8][8];
bool vis[8][8];
int dir[8][2]={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}};
int stx,sty,edx,edy;
void bfs(int x, int y)
{
int front = 0, rear = 0;
vis[x][y] = true;
q[rear++] = 8 * x + y;
while(front < rear)
{
int c = q[front++];
x = c / 8;
y = c % 8;
if(x == edx && y == edy)
return;
for(int i = 0; i < 8; i++)
{
int nx = x + dir[i][0];
int ny = y + dir[i][1];
if(nx >= 0 && nx < 8 && ny >= 0 && ny < 8 && !vis[nx][ny])
{
vis[nx][ny] = true;
q[rear++] = nx * 8 + ny;
step[nx][ny] = step[x][y] + 1;
}
}
}
}
int main()
{
char st[3], ed[3];
while(cin >> st >> ed)
{
stx = st[1] - '1';
sty = st[0] - 'a';
edx = ed[1] - '1';
edy = ed[0] - 'a';
memset(vis, false, sizeof(vis));
memset(step, 0, sizeof(step));
bfs(stx, sty);
printf("To get from %s to %s takes %d knight moves.\n",st,ed,step[edx][edy]);
}
return 0;
}