骑士征程
来源:互联网 发布:高校大数据专业课程 编辑:程序博客网 时间: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;
}