c语言跳马思路,跳马问题 - 日拱一卒的个人空间 - OSCHINA - 中文开源技术交流社区...

这篇博客介绍了两种不同的算法实现,用于计算半张象棋棋盘上马从左下角到右上角的所有跳跃路径。第一种算法采用逆向递归的方式,从目标位置开始回溯所有可能的步法;第二种算法则是正向递归,从起点开始逐步扩展路径。这两种方法都在VC++6.0环境下进行了调试和验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

半张象棋棋盘,一马从左下角跳到右上角,只能往右跳,不能往左跳,输出所有跳步步骤。

算法1:逆向递归

#include

#include

typedef struct node{

int x, y;

struct node *nextStep;

}stepNode;

stepNode *q;

stepNode* arrProcess[100];

int count = 0;

int func(int, int, stepNode*);

void main(){

int destX, destY;

int i, flag;

stepNode *p;

printf("请输入要到达点的坐标(0

scanf("%d%d", &destX, &destY);

flag = func(destX, destY, NULL);

if(flag == 0){

printf("亲,跳不到点(%d,%d)哟!\n", destX, destY);

}else{

printf("共有%d种走法\n", count);

for(i=0; i

printf("第%d中方法:\n", i+1);

for(p=arrProcess[i]; p!=NULL; p=p->nextStep) printf("(%d,%d)\t", p->x, p->y);

printf("\n");

}

}

}

int func(int x, int y, stepNode *p){

int flag1, flag2, flag3, flag4;

if(x<0 || x>8 || y<0 || y>4) return 0;

q = (stepNode*)malloc(sizeof(stepNode));

q->x = x;

q->y = y;

q->nextStep = p;

p = q;

if(x==0 && y==0){

arrProcess[count++] = q;

return 1;

}

flag1 = func(x-1, y-2, p);

flag2 = func(x-2, y-1, p);

flag3 = func(x-2, y+1, p);

flag4 = func(x-1, y+2, p);

if(flag1+flag2+flag3+flag4 == 0){

free(p);

return 0;

}else{

return 1;

}

}

算法2:正向递归

#include

#include

typedef struct node{

int x, y;

struct node *p1, *p2, *p3, *p4;

int n1, n2, n3, n4;

}stepNode;

int destX, destY, count;

stepNode *head;

int func(int, int, stepNode **);

void showProcess();

void main(){

printf("请输入要到达点的坐标(0

scanf("%d%d", &destX, &destY);

count = func(0, 0, &head);

showProcess();

}

int func(int x, int y, stepNode **p){

int n;

*p = (stepNode *)malloc(sizeof(stepNode));

(*p)->x = x; (*p)->y = y;

if(x<0 || x>8 || y<0 || y>4 || x>destX){

n=0;

}else if(x==destX && y==destY){

(*p)->p1 = NULL;

(*p)->p2 = NULL;

(*p)->p3 = NULL;

(*p)->p4 = NULL;

n = 1;

}else{

(*p)->n1 = func(x+1, y+2, &((*p)->p1));

(*p)->n2 = func(x+2, y+1, &((*p)->p2));

(*p)->n3 = func(x+2, y-1, &((*p)->p3));

(*p)->n4 = func(x+1, y-2, &((*p)->p4));

n = (*p)->n1 + (*p)->n2 +  (*p)->n3 + (*p)->n4;

}

if(n==0){free (*p); *p = NULL;}

return n;

}

void showProcess(){

int i;

stepNode *p;

if(count == 0){

printf("亲,跳不到点(%d,%d)哟!\n", destX, destY);

return;

}

printf("共有%d种走法\n", count);

for(i=0; i

printf("第%d中走法:\n", i+1);

p = head;

while(p!=NULL){

printf("(%d,%d)  ", p->x, p->y);

if(p->n1 != 0){p->n1-=1; p=p->p1;}

else if(p->n2 != 0){p->n2-=1; p=p->p2;}

else if(p->n3 != 0){p->n3-=1; p=p->p3;}

else {p=p->p4; p->n4-=1;}

}

printf("\n");

}

}

调试环境:VC++6.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值