HDU 1372 骑士漫游 bfs

“骑士漫游”的问题大意如下: 
在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;
}



你可能感兴趣的:(HDU 1372 骑士漫游 bfs)