计算机科学马踏棋盘,马踏棋盘

马踏棋盘问题是旅行商问题(TSP)或哈密顿回路问题(HCP)的一个特例。在 8×8 的国际象棋棋盘上,用一个马按照马步跳遍整个棋盘,要求每个格子都只跳到一次,最后回到出发点。这是一个 NP问题,通常采用回溯法或启发式搜索类算法求解。在 9×10 的中国象棋棋盘上也可以实现马步遍历。

中文名

马踏棋盘

外文名

Knight's tour problem别    名

骑士周游

马步遍历

所属学科

计算机算法

马踏棋盘需求分析

编辑

语音

将马随机放在国际象棋的Board[0~7][0~7]的某个方格中,马按走棋规则进行移动。,走遍棋盘上全部64个方格。编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个8×8的方阵,输出之。

马踏棋盘核心代码

编辑

语音

#define STACK_INIT_SIZE 100

#define STACKINCREMENT 10

#define OVERFLOW -2

#define OK 1

#include

#include

#include

int Board[8][8]={0};

int HTry1[8]={2,-1,1,-2,2,1,-1,-2};

int HTry2[8]={1,2,2,1,-1,-2,-2,-1};

typedef struct{

int i;

int j;

}PosType;

typedef struct{

int ord;

PosType seat;

int di;

}SElemType;

typedef struct{

SElemType *base;

SElemType *top;

int stacksize;

}SqStack;

int InitStack(SqStack *s1){

(*s1).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));

if(!(*s1).base) exit(OVERFLOW);

(*s1).top=(*s1).base;

(*s1).stacksize=STACK_INIT_SIZE;

return(OK);

}

SElemType Pop(SqStack *s,SElemType e){

e=*--(*s).top;

return e;

}

int Push(SqStack *s1,SElemType e){

if((*s1).top-(*s1).base>=(*s1).stacksize){

(*s1).base=(SElemType *)realloc((*s1).base,

((*s1).stacksize+STACKINCREMENT)*sizeof

(SElemType));

if(!(*s1).base) exit(OVERFLOW);

(*s1).top=(*s1).base+(*s1).stacksize;

(*s1).stacksize+=STACKINCREMENT;

}

*(*s1).top++=e;

return OK;

}

int StackEmpty(SqStack *s){

if((*s).base==(*s).top)

return(1);

else

return(0);

}

int curstep=0;

int Pass(PosType s){

if((Board[s.i][s.j]==0)&&(s.i<=7)&&(s.i>=0)&&(s.j<=7)&&(s.j>=0))

return(1);

else

return(0);

}

PosType NextPos(PosType s,int i){

s.i=s.i+HTry1[i-1];

s.j=s.j+HTry2[i-1];

return(s);

}

void horsesteps(int Board[8][8],PosType start){

int k,j;

SqStack S;

SElemType e;

PosType curpos=start;

InitStack(&S);

do{

if(Pass(curpos)){

curstep++;

Board[curpos.i][curpos.j]=curstep;

e.seat=curpos;

e.ord=curstep;

e.di=1;

Push(&S,e);

if(curstep==64)

break;

else

curpos=NextPos(curpos,1);

}//if

else{

if(!StackEmpty(&S)){

Pop(&S,e);

if(e.di==8) Board[e.seat.i][e.seat.j]=0;

while(e.di==8&&!StackEmpty(&S)){

e=Pop(&S,e);

if(e.di==8) Board[e.seat.i][e.seat.j]=0;

curstep=e.ord;

}//while

if(e.di<8){

e.di++;

Push(&S,e);

curpos=NextPos(e.seat,e.di);

}//if

}//if

}//else

}while(!StackEmpty(&S));

if(StackEmpty(&S)){

printf("马儿从这个初始位置不能踏遍棋盘\n");

printf("请按任意键推出本程序\n");

getchar();

exit(OVERFLOW);

}

for(j=0;j<8;j++){

printf("\n");

for(k=0;k<8;k++)

printf("%3d",Board[j][k]);

}// for

}//函数结束

void main(){

int k,j;

PosType t;

char a,b;

printf("请输入马儿的初始位置\n");

fflush(stdin);

scanf("%c%d,%d%c",&a,&k,&j,&b);

t.i=k;

t.j=j;

printf("马儿走的路线为\n");

horsesteps(Board,t);

}

词条图册

更多图册

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值