骑士征程

来源:互联网 发布:高校大数据专业课程 编辑:程序博客网 时间:2024/06/10 04:35

         今天终于完成“骑士征程”编程题,感觉很难,需要考虑的变化比较多。
         当前坐标,下一个坐标等等,最难搞的就是方向的确定。算法也有多种选择,不过凭我的大脑只能想到两种比较简单的,而且第二种还是在第一种的基础上实现的,呵呵。(感觉这就像有人问我会做几样菜,我答:会两种,第一,蛋炒饭;第二,饭炒蛋。)
         测试时,出现了一个比较严重的bug,属于逻辑上的问题,可能是刚开始没想好,查了好久才搞出来。就是在判断骑士和棋盘界限时,把当前骑士坐标和骑士的下个坐标点搞混了,结果骑士跳不到棋盘最里面的行列。
         虽最终实现了题目的基本要求,但还有个问题:骑士跳到三四步时就卡了,问题是走到死胡同里了,没有地方可以继续跳了。
解决办法:用nexti[l],nextj[l](0<=l<=7)记录下一步骑士的方位,置exits[l]为格(nexti[l],nextj[l])的出路,对于检查每一格(nexti[l] + imove[i],nextj[l] + jmove[j])的出路,取出路最少的格,将之赋值给min,最小不止一个,则将第一个赋给min。这个办法不一定会让骑士走完所有的棋盘格子,但至少会大大的提高能走得步数。
我未用解决办法前的代码如下(写的不好,莫笑~呵呵):

#include <stdio.h>
#include <time.h>

#define ROWS 8
#define COLS 8

int board[ROWS][COLS];                     /*定义棋盘为8×8*/
int imove[8], jmove[8];  /*移动的方位,其中0~7各有其值*/
int ikt,jkt;    /*骑士的当前坐标,骑士,knight*/

void Initial()   /*初始化整个棋盘,骑士的起点为-1,移动方位各赋其值*/
{
 int i, j;
 int Pos;
 for(i = 0; i < ROWS; i++)
  for(j = 0; j < COLS; j++)
   board[i][j] = 0;
 ikt = 4;
 jkt = 4;
 board[ikt][jkt] = -1;

 for(Pos = 0; Pos < 8; Pos++)
 {
  switch(Pos)
  {
   case 0:
    imove[Pos] = -2;
    jmove[Pos] = 1;
    break;
   case 1:
    imove[Pos] = -1;
    jmove[Pos] = 2;
    break;
   case 2:
    imove[Pos] = 1;
    jmove[Pos] = 2;
    break;
   case 3:
    imove[Pos] = 2;
    jmove[Pos] = 1;
    break;
   case 4:
    imove[Pos] = 2;
    jmove[Pos] = -1;
    break;
   case 5:
    imove[Pos] = 1;
    jmove[Pos] = -2;
    break;
   case 6:
    imove[Pos] = -1;
    jmove[Pos] = -2;
    break;
   case 7:
    imove[Pos] = -2;
    jmove[Pos] = -1;
    break;
  }
 }

}

void PrintBoard()     /*打印棋盘*/
{
 int i, j;
 for(i = 0; i < ROWS; i++)
 {
  for(j = 0; j < COLS; j++)
   printf("%3d", board[i][j]);
  putchar('/n');
 }
}

int Generate(int *itemp, int *jtemp)   /*产生一个随机方向,itemp,jtemp表示骑士下一个所在的位置*/
{
 int GeneratePos;

 GeneratePos = rand() % 8;

 *itemp = ikt + imove[GeneratePos];
 *jtemp = jkt + jmove[GeneratePos];

 if(*itemp < 0 || *itemp > 7 || *jtemp < 0 || *jtemp > 7)
  return -1;

 if(*itemp > 5 || *itemp < 2)
 {
  switch(ikt)
  {
   case 0:
    if(GeneratePos == 0 || GeneratePos == 7
         || GeneratePos == 1 || GeneratePos == 6)
     return -1;
    break;
   case 1:
    if(GeneratePos == 0 || GeneratePos == 7)
     return -1;
    break;
   case 6:
    if(GeneratePos == 3 || GeneratePos == 4)
     return -1;
    break;
   case 7:
    if(GeneratePos == 2 || GeneratePos == 3
         || GeneratePos == 4 || GeneratePos == 5)
     return -1;
    break;
   default:
    break;
  }


  }
  if(*jtemp > 5 || *jtemp < 2)
  {
  switch(jkt)
  {
   case 0:
    if(GeneratePos == 7 || GeneratePos == 6
         || GeneratePos == 5 || GeneratePos == 4)
     return -1;
    break;
   case 1:
    if(GeneratePos == 5 || GeneratePos == 6)
     return -1;
    break;
   case 6:
    if(GeneratePos == 1 || GeneratePos == 2)
     return -1;
    break;
   case 7:
    if(GeneratePos == 1 || GeneratePos == 2
         || GeneratePos == 0 || GeneratePos == 3)
     return -1;
    break;
   default:
    break;
  }
 }
 return GeneratePos;
}
void Move()                                                                       /*移动骑士,并打印出来*/
{
 int step = 0;
 int itemp = 0, jtemp = 0;
 int NewPos, PrePos;

 while(step < 64)
 {
  NewPos = -1;
  while(NewPos < 0)
  {
   NewPos = Generate(&itemp, &jtemp);
  }
  PrePos = NewPos;

  if(board[itemp][jtemp] != 0)
  {   do
   {
    NewPos = Generate(&itemp, &jtemp);
   }while(NewPos < 0 || PrePos == NewPos);

   PrePos = NewPos;
  }

  if(board[itemp][jtemp] == 0)
  {
   ikt = itemp;
   jkt = jtemp;
   board[ikt][jkt] = ++step;
  }

  clrscr();
  PrintBoard();
/*  printf("%d/n", step);
  getch();
*/
 }
 getch();
}

int main(void)
{
 clrscr();
 srand((unsigned)time(NULL));
 Initial();
 PrintBoard();
 clrscr();

 Move();
 getch();
 return 0;
}