1 /*
 2 **假设国际象棋棋盘有5*5=25个格子,设计一个程序,使棋子从初始位置开始跳马,能够把棋盘格子全部走一遍
 3 **每个格子只允许走一次。
 4 **要求:1)写出其中一个解。
 5         2)求总共有多少个解。
 6 **/
 7
 8 //算法思路:
 9 /*
10 **由于对于程序来讲,每一个格子都是新的开始,都面临着同样的选择,即都有八个方向的选择
11 **因此适用于递归思想。至于能否走通,得去尝试。递归过程中,产生一颗递归树,检查过程中
12 **走不通就剪枝。尝试下一个树枝。因此有int trial(int x,int y)函数。棋盘用一个二维数组
13 **表示棋子序号,一个坐标代表,再用一个二维数组记录棋盘的某个坐标是否已经被踏过。
14 */
15
16 #include<stdio.h>
17
18 int trace[25] = {0}, counter = 0;
19 int steps = 0, k = 1;             //k在此的作用为只打印一种方案的开关
20 int chessboard[5][5];            //棋盘
21 int flag[5][5];                    //给棋盘做标记
22
23 //函数声明区
24 void init();
25 void printResult(int k);
26 void walk(int x, int y);
27
28 int main(){
29     init();
30     walk(0, 0);
31     printf("the answer number:%d\n", counter);
32     return 0;
33 }
34
35 /*
36 **探寻可走的路
37 */
38 void walk(int x, int y)
39 {
40     if(x<0 || x >4 || y<0 || y > 4 || flag[x][y] == 1)
41         return;                            //走不通,返回.
42     flag[x][y] = 1;
43     trace[steps++] = chessboard[x][y];    //记录每一步所走的位置
44     if(steps > 24)
45     {
46         counter++;
47         printResult(100);
48         flag[x][y] = 0;
49         steps--;
50         return;
51     }
52     //这里是每个格子的各种走法
53     walk(x + 1, y + 2);        //上走有拐
54     walk(x + 1, y - 2);        //上走左拐
55     walk(x - 1, y + 2);        //下走有拐
56     walk(x - 1, y - 2);        //下走左拐
57     walk(x + 2, y + 1);        //右走上拐
58     walk(x + 2, y - 1);        //右走下拐
59     walk(x - 2, y + 1);        //左走上拐
60     walk(x - 2, y - 1);        //左走下拐
61     flag[x][y] = 0;
62     steps--;
63 }
64
65
66 //初始化二维数组
67 void init()
68 {
69     int i,j,pos = 1;
70     for(i = 0 ; i < 5 ; i++)
71         for(j = 0 ; j < 5 ; j++)
72         {
73             chessboard[i][j] = pos++;     //初始化棋盘
74             flag[i][j] = 0;                //初始化话标记
75         }
76 }
77
78
79 /*
80 **打印第k个结果,k为0默认打印全部。
81 */
82
83 void printResult(int k)
84 {
85     int i;
86     static num = 0;
87     if(k !=0 )
88         if(++num != k)
89             return;
90     printf("The %dth case is: for example [step,point]\n",k);
91     for (i = 0; i < 25; i++)
92     {
93         printf("[%-2d,%-2d] ", i+1, trace[i]);
94         if((i+1)%5==0)
95             printf("\n");
96     }
97 }

转载于:https://www.cnblogs.com/houjun/p/6507689.html

国际象棋马走日(骑士周游)相关推荐

  1. 国际象棋马走日(华科软院上机)

    问题描述:假设国际象棋棋盘有5*5共25个格子.设计一个程序,使棋子从初始位置(棋盘编号为1的位置)开始跳马,能够把棋盘的格子全部都走一遍,每个格子只允许走一次.要求: 1):输出一个解(用二维数组来 ...

  2. 数据结构-马走日的解法

    [题目来自灰灰考研] (2018上海交通大学上机题)(2017华中科技大学上机题) 假设国际象棋棋盘有5*5共25个格子.设计一个程序,使棋子从初始位置(如图)开始跳马,需要将棋盘的格子全部都走一遍, ...

  3. 算法提高课-搜索-DFS之搜索顺序-AcWing 1116. 马走日:dfs

    题目分析 来源:acwing 分析: dfs分两类,一类是内部搜索,不需要恢复现场:一类是外部搜索(以整个图作为状态),需要恢复现场.这里的马走日就是状态图,需要恢复现场. 理清dfs,需要画一个搜索 ...

  4. 信息学奥赛一本通(1219:马走日)

    1219:马走日 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 12078     通过数: 6316 [题目描述] 马在中国象棋以日字形规则移动. 请编写一段程 ...

  5. 马走日程序Java_马走日什么意思

    中国象棋在中国有着三千多年的历史,在中国古代,象棋被列为士大夫们的修身之艺,属于琴棋书画四艺之一.现在则被视为是怡神益智的一种有益身心的活动. 中国象棋是由两人轮流走子,以"将死" ...

  6. Bailian4123 马走日【DFS】

    4123:马走日 总时间限制: 1000ms 内存限制: 1024kB 描述 马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的 ...

  7. 【密码岛OJ】1753 马走日题解

    作为一名密码岛码农,出道深搜 马走日是一道典型的深搜题,主要找准方向再判断日字形就完了 上代码 第一次写题解 不是很熟练 马走日的主要思路就是先定义两个方向数组,然后开一个dfs 求累加和 如果属于日 ...

  8. 马走日,象走田;车走直路炮翻山

    棋子种类 车(車)马(馬)象(相)士(仕)将(帅): 还有炮(砲)和卒(兵). 走法口诀 马走日,象走田: 车走直路炮翻山: 士走斜线护将边: 小卒一去不回还. 走法解读 马为骑兵,直走斜砍,故走日! ...

  9. GDUT - 专题学习1 C - 马走日

    C - 马走日 题目 马在中国象棋以日字形规则移动. 请编写一段程序,给定 n×m 大小的棋盘,以及马的初始位置 (x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. ...

  10. 马走日(DFS深搜)

    马走日 目录 马走日 题意描述:给多组数据,给棋盘的大小和马的初始位置,求有多少种方法让马走日全部走过棋盘,不能重复走棋盘的同一个点 解题思路:利用数组来对所有的棋盘上所有的点初始化表示未走过,把马的 ...

最新文章

  1. 传感器标定两篇顶会论文解析
  2. 来!说说你在流量控制方面的经验!
  3. Oracle表空间文件损坏后的排查及解决
  4. 去除php_eol,php去除换行符的方法小结(PHP_EOL变量的使用)
  5. 帝国cms让当前栏目显示不同样式(图文)
  6. pygame两图层怎么搞_每天解决一个卖酒问题(176):小白怎么开拓市场?
  7. 大数据学习——akka自定义RPC
  8. [python 进阶] 第7章 函数装饰器和闭包
  9. 荣耀20 PRO差评太多?原来是这个原因,回应:差评不冤
  10. python 图片相似度算法比较_python 比较2张图片的相似度的方法示例
  11. python学习笔记(14)参数对应
  12. python能做什么项目-python能做什么项目
  13. POJ 1226 Substrings(后缀数组)
  14. android与rn混合开发,RN 混合开发项目调用安卓原生解决方案
  15. 小白0代码基础学习RF接口测试心灵路程
  16. 获取公众号文章封面 API 接口
  17. precede和previous_描写过去的词语 英语
  18. java怎么读取docx文件_java – 如何显示或读取docx文件
  19. Outlook设置规则的一点提示
  20. python 协程库gevent学习 -- 超时、互斥锁(BoundedSemaphore)、local

热门文章

  1. 良心安利草皮3d纹理图片素材网站
  2. 2035年进入现代化交通强国行列
  3. 「ggplot2练习」画基因结构图
  4. 计算机的控制面板打不开,控制面板打不开,教您控制面板打不开怎么办
  5. dw版权信息栏如何制作_Dreamweaver怎么制作网页模板
  6. ffmpeg MP3转wav
  7. postgresql 9.5 now()函数少8小时
  8. 【突破次元壁】谁说二次元离我们遥远?Python特效火遍全网,关键技术原来是它。
  9. 母亲节祝福html源码,有创意的母亲节祝福语大全
  10. 不能访问网络位置的解决方法(转)