国际象棋马走日(骑士周游)
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
国际象棋马走日(骑士周游)相关推荐
- 国际象棋马走日(华科软院上机)
问题描述:假设国际象棋棋盘有5*5共25个格子.设计一个程序,使棋子从初始位置(棋盘编号为1的位置)开始跳马,能够把棋盘的格子全部都走一遍,每个格子只允许走一次.要求: 1):输出一个解(用二维数组来 ...
- 数据结构-马走日的解法
[题目来自灰灰考研] (2018上海交通大学上机题)(2017华中科技大学上机题) 假设国际象棋棋盘有5*5共25个格子.设计一个程序,使棋子从初始位置(如图)开始跳马,需要将棋盘的格子全部都走一遍, ...
- 算法提高课-搜索-DFS之搜索顺序-AcWing 1116. 马走日:dfs
题目分析 来源:acwing 分析: dfs分两类,一类是内部搜索,不需要恢复现场:一类是外部搜索(以整个图作为状态),需要恢复现场.这里的马走日就是状态图,需要恢复现场. 理清dfs,需要画一个搜索 ...
- 信息学奥赛一本通(1219:马走日)
1219:马走日 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 12078 通过数: 6316 [题目描述] 马在中国象棋以日字形规则移动. 请编写一段程 ...
- 马走日程序Java_马走日什么意思
中国象棋在中国有着三千多年的历史,在中国古代,象棋被列为士大夫们的修身之艺,属于琴棋书画四艺之一.现在则被视为是怡神益智的一种有益身心的活动. 中国象棋是由两人轮流走子,以"将死" ...
- Bailian4123 马走日【DFS】
4123:马走日 总时间限制: 1000ms 内存限制: 1024kB 描述 马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的 ...
- 【密码岛OJ】1753 马走日题解
作为一名密码岛码农,出道深搜 马走日是一道典型的深搜题,主要找准方向再判断日字形就完了 上代码 第一次写题解 不是很熟练 马走日的主要思路就是先定义两个方向数组,然后开一个dfs 求累加和 如果属于日 ...
- 马走日,象走田;车走直路炮翻山
棋子种类 车(車)马(馬)象(相)士(仕)将(帅): 还有炮(砲)和卒(兵). 走法口诀 马走日,象走田: 车走直路炮翻山: 士走斜线护将边: 小卒一去不回还. 走法解读 马为骑兵,直走斜砍,故走日! ...
- GDUT - 专题学习1 C - 马走日
C - 马走日 题目 马在中国象棋以日字形规则移动. 请编写一段程序,给定 n×m 大小的棋盘,以及马的初始位置 (x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. ...
- 马走日(DFS深搜)
马走日 目录 马走日 题意描述:给多组数据,给棋盘的大小和马的初始位置,求有多少种方法让马走日全部走过棋盘,不能重复走棋盘的同一个点 解题思路:利用数组来对所有的棋盘上所有的点初始化表示未走过,把马的 ...
最新文章
- 传感器标定两篇顶会论文解析
- 来!说说你在流量控制方面的经验!
- Oracle表空间文件损坏后的排查及解决
- 去除php_eol,php去除换行符的方法小结(PHP_EOL变量的使用)
- 帝国cms让当前栏目显示不同样式(图文)
- pygame两图层怎么搞_每天解决一个卖酒问题(176):小白怎么开拓市场?
- 大数据学习——akka自定义RPC
- [python 进阶] 第7章 函数装饰器和闭包
- 荣耀20 PRO差评太多?原来是这个原因,回应:差评不冤
- python 图片相似度算法比较_python 比较2张图片的相似度的方法示例
- python学习笔记(14)参数对应
- python能做什么项目-python能做什么项目
- POJ 1226 Substrings(后缀数组)
- android与rn混合开发,RN 混合开发项目调用安卓原生解决方案
- 小白0代码基础学习RF接口测试心灵路程
- 获取公众号文章封面 API 接口
- precede和previous_描写过去的词语 英语
- java怎么读取docx文件_java – 如何显示或读取docx文件
- Outlook设置规则的一点提示
- python 协程库gevent学习 -- 超时、互斥锁(BoundedSemaphore)、local