问题:

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

算法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

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

  1. 第39级台阶回溯算法c语言,五大经典算法之回溯法 - osc_9ipdey7e的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.基本概念 回溯法,又称为试探法,按选优条件向前不断搜索,以达到目标.但是当探索到某一步时,如果发现原先选择并不优或达不到目标,就会退回一步重新选择,这种达不到目的就退回再走的算法称为回溯法. 与穷 ...

  2. c语言读取pnm图片,ppm图像相关 - osc_p1rj1z8j的个人空间 - OSCHINA - 中文开源技术交流社区...

    PPM图像格式介绍 直接拿具体的数据来说明是最直接的,使用ue打开ppm文件,采用的都是十六进制asc码表示的,这里要注意地址00000000h中的最后一个字母是始终不变的,这原来没注意晕了我好久,第 ...

  3. c语言兔子洞,数据结构水题选讲 - osc_y08db3kb的个人空间 - OSCHINA - 中文开源技术交流社区...

    [Ynoi2011]ODT \(O(nlog^2n)\) 的做法非常显然 直接把树重链剖分一下,每个点维护轻儿子的平衡树就行 但是这题 \(1e6\) 的数据范围使得 \(O(nlog^2n)\) 没 ...

  4. c语言第三次作业(循环),C语言——第三次作业 - osc_kt69pvbx的个人空间 - OSCHINA - 中文开源技术交流社区...

    #作业要求一# 题目6-1 输出月份英文名 题目6-2 查找星期 题目6-3 计算最长的字符串长度 题目6-4 指定位置输出字符串 作业:C高级第三次作业(2)没有思路,知识点也没有明白,未完成. # ...

  5. c语言平时作业完成的评价,C语言作业评价标准 - osc_fmg49rzg的个人空间 - OSCHINA - 中文开源技术交流社区...

    C语言作业评价标准 作业内容: 每周作业分为基础作业.挑战作业和预习作业: 基础作业为本周所学内容的巩固: 挑战作业包括但不仅限于所学知识的综合运用: 预习作业为下周所学内容的任务单,要求必须在课前完 ...

  6. %20ld c语言,C语言第二次实验报告 - osc_ldea7g3t的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.实验题目,设计思路,实现方法 第十一次作业(二维数组): 11-5 打印杨辉三角(20 分) 本题要求按照规定格式打印前N行杨辉三角. 输入格式: 输入在一行中给出N(1≤N≤10). 输出格式: ...

  7. 关联规则可视化python语言_关联规则可视化 - 猪猪daxia的个人空间 - OSCHINA - 中文开源技术交流社区...

    关联规则挖掘是一种流行的数据挖掘方法,在R语言中为扩展包arules.然而,挖掘关联规则往往导致非常多的规则,使分析师需要通过查询所有的规则才能发现有趣的规则.通过手动筛选大量的规则集是费时费力.在本 ...

  8. java亲密数的解题思路,算法解题思路总结 - jjhgx的个人空间 - OSCHINA - 中文开源技术交流社区...

    算法解题思路: 细读算法要求 找到极限情况 找到临界情况,结果依赖 找到最终的结束求解点 编程实现:考虑算法的空间复杂度和时间复杂度 案例说明: 假设: 输入字符串为:s, 长度为:slen, s的第 ...

  9. python生成日历书上哪里错了_python生成日历 - osc_a5pzxo31的个人空间 - OSCHINA - 中文开源技术交流社区...

    日历是以1900年1月1日 为基础的 那天的星期1是 # 判断是否是闰年 def rn(i): # 判断是不是闰年 if (i % 400 == 0) or (i % 4 == 0 and i % 1 ...

最新文章

  1. 组合查询——怎样使用窗口的继承达到事半功倍?
  2. OpenCASCADE:Modeling Algorithms模块几何工具之来自约束的线和圆
  3. JS模拟的Ping程序 (Web Ping)
  4. clion 32位xp安装 64位软件
  5. HDFS异常:last block does not have enough number of replicas
  6. Android系统分辨率修改方法,Android:系统分辨率的修改
  7. DM数据库归档备份还原
  8. 【转】自动化专业十大看家课程
  9. NKOI 3539 移棋子游戏[6月月赛题A]
  10. 至强服务器系列,2020 最新 至强 Xeon 服务器系列 CPU天梯图
  11. 【期末复习】现代管理科学基础
  12. 研发人员需要什么知识和能力
  13. Cacti auth.php,linux下cacti的搭建之详细过程!
  14. quartz2.2.3 spring整合遇到的错误,及quartz配置文件说明
  15. (2019春)软件构造:雨课堂试卷(第3章)
  16. 【GDOI2018模拟7.7】暴力大神hxx 树形dp
  17. html表单新增类型,HTML5表单设计——新增输入类型和新增表单属性
  18. 追光者计算机 音乐,追光者歌曲
  19. Word控件Spire.Doc 【页面设置】教程(9) 如何在 C# 中添加行号
  20. SecureCRT$SecureFX的安装方法

热门文章

  1. 【电子产品】关于指纹考勤机识别率下降
  2. 堆垛机器人编程技巧_两步变身老鸟,手把手教你提升ABB机器人编程技巧!(二)...
  3. HTML 动态背景
  4. 万花哥特体繁黑执事中文字体_50多种免费的高质量哥特式和恐怖字体
  5. python自动化:uiautomation、pyautogui操作会计记账系统(6):打印会计凭证
  6. 【优化求解】基于灰狼算法GWO求解最优目标matlab代码
  7. 微信小程序——View背景设置
  8. EL表达式基础语法总结
  9. 创造与魔法怎么自建服务器,创造与魔法如何搭建出梦想中的房屋
  10. 第 4 题 打折日期交叉问题