题目见zoj 1091
使用宽度搜索优先来求解,这个算法已经忘记的差不多了,所以写出来的代码很罗嗦,看起来很不清晰。
好像还可以直接用公式或者神经网络算法求解,详见Knight's Tour
/* zoj 1091 Knight Moves */
#include <stdio.h>
#include <string.h>
#define MAX 100
#define BOARDSIZE (8+1)
struct queueStruct{
int x;
int y;
int step;
}queue[MAX],tempQueue;
int front;
int rear;
int minStep;
int isVisited[BOARDSIZE][BOARDSIZE];
const int searchTable[8][2] = {{-2,-1},{-1,-2},{-2,1},{-1,2},{1,2},{2,1},{1,-2},{2,-1}};
int bfs(int startx, int starty, int endx, int endy, int step);
int main(void)
{
char src[3],des[3];
int startx, starty, endx, endy;
while(scanf("%s %s",src,des) == 2)
{
memset(isVisited,0,sizeof(isVisited));
memset(queue,0,sizeof(queue));
front = rear = 0;
startx = src[0] - 'a' + 1;
starty = src[1] - '0';
endx = des[0] - 'a' + 1;
endy = des[1] - '0';
bfs(startx,starty,endx,endy,0);
printf("To get from %s to %s takes %d knight moves.\n",src,des,minStep);
}
return 0;
}
int bfs(int startx, int starty, int endx, int endy, int step)
{
int i;
struct queueStruct q;
if(startx == endx && starty == endy)
{
minStep = step;
return 0;
}
isVisited[startx][starty] = 1;
tempQueue.x = startx;
tempQueue.y = starty;
tempQueue.step = step;
queue[rear++] = tempQueue;
while(front < rear)
{
tempQueue = queue[front++];
for(i = 0; i < BOARDSIZE; i++)
{
/* q = tempQueue;*/
q.x = tempQueue.x + searchTable[i][0];
q.y = tempQueue.y + searchTable[i][1];
q.step = tempQueue.step + 1;
if(q.x < 1 || q.x > 8 || q.y < 1 || q.y > 8 ||isVisited[q.x][q.y])
continue;
if(q.x == endx && q.y == endy)
{
minStep = q.step;
return 0;
}
queue[rear++] = q;
isVisited[q.x][q.y] = 1;
}
}
return 0;
}
565

被折叠的 条评论
为什么被折叠?



