zoj 1091 Knight Moves

  题目见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;
}
 

你可能感兴趣的:(move)