dfs:马踏棋盘
1 #include<stdio.h>
2 #include<time.h>
3
4 #define X 8
5 #define Y 8
6
7 int chess[X][Y];
8
9 //查找当前位置的下一个位置
10 int nextxy(int* x, int* y, int count)
11 {
12 switch (count)
13 {
14 case 0:
15 if (*x + 2 <= X - 1 && *y - 1 >= 0 && chess[*x + 2][*y - 1] == 0)
16 {
17 *x += 2;
18 *y -= 1;
19 return 1;
20 }
21 break;
22
23 case 1:
24 if (*x + 2 <= X - 1 && *y + 1 <= Y - 1 && chess[*x + 2][*y + 1] == 0)
25 {
26 *x += 2;
27 *y += 1;
28 return 1;
29 }
30 break;
31
32 case 2:
33 if (*x + 1 <= X - 1 && *y + 2 <= Y - 1 && chess[*x + 1][*y + 2] == 0)
34 {
35 *x += 1;
36 *y += 2;
37 return 1;
38 }
39 break;
40
41 case 3:
42 if (*x - 1 >= 0 && *y + 2 <= Y - 1 && chess[*x - 1][*y + 2] == 0)
43 {
44 *x -= 1;
45 *y += 2;
46 return 1;
47 }
48 break;
49
50 case 4:
51 if (*x - 2 >= 0 && *y + 1 <= Y - 1 && chess[*x - 2][*y + 1] == 0)
52 {
53 *x -= 2;
54 *y += 1;
55 return 1;
56 }
57 break;
58
59 case 5:
60 if (*x - 2 >= 0 && *y - 1 >= 0 && chess[*x - 2][*y - 1] == 0)
61 {
62 *x -= 2;
63 *y -= 1;
64 return 1;
65 }
66 break;
67
68 case 6:
69 if (*x - 1 >= 0 && *y - 2 >= 0 && chess[*x - 1][*y - 2] == 0)
70 {
71 *x -= 1;
72 *y -= 2;
73 return 1;
74 }
75 break;
76
77 case 7:
78 if (*x + 1 <= X - 1 && *y - 2 >= 0 && chess[*x + 1][*y - 2] == 0)
79 {
80 *x += 1;
81 *y -= 2;
82 return 1;
83 }
84 break;
85 default:
86 break;
87 }
88
89 return 0;
90 }
91
92 void print()
93 {
94 int i, j;
95 for (i = 0; i < X; i++)
96 {
97 for (j = 0; j < Y; j++)
98 {
99 printf("%2d\t", chess[i][j]);
100 }
101 printf("\n");
102 }
103
104 printf("\n");
105 }
106
107 //深度优先遍历
108 //(x,y)为位置坐标
109 //tag为标记变量,每走一步,tag+1
110 int TravelChessBoard(int x, int y, int tag)
111 {
112 int x1 = x;
113 int y1 = y;
114 int flag = 0;
115 int count = 1;
116 chess[x][y] = tag;
117
118 if (tag == X * Y)
119 {
120 //打印棋盘
121 print();
122 return 1;
123 }
124 //找到马的下一个可走坐标(x1,y1),如果找到flag = 1,否则为0
125 flag = nextxy(&x1, &y1, count);
126 while (flag == 0 && count < 8)
127 {
128 count++;
129 flag = nextxy(&x1, &y1, count);
130 }
131
132
133 while (flag)
134 {
135 if (TravelChessBoard(x1, y1, tag + 1))
136 {
137 return 1;
138 }
139
140 //继续找到马的下一步的可走的坐标(x1,y1),如果找到flag = 1,否则为0
141 x1 = x;
142 y1 = y;
143 count++;
144
145 flag = nextxy(&x1, &y1, count);
146 while (flag == 0 && count < 8)
147 {
148 count++;
149 flag = nextxy(&x1, &y1, count);
150 }
151 }
152
153 if (flag == 0)
154 {
155 chess[x][y] = 0;
156 }
157
158 return 0;
159 }
160
161 int main()
162 {
163 int i, j;
164 clock_t start, finish;
165
166 start = clock();
167
168 for (i = 0; i < X; i++)
169 {
170 for (j = 0; j < Y; j++)
171 {
172 chess[i][j] = 0;
173 }
174 }
175
176 printf("下面开始马踏棋盘:\n");
177 if (!TravelChessBoard(1, 0, 1))
178 {
179 printf("马踏棋盘失败了\n");
180 }
181
182 finish = clock();
183 printf("\n本次计算义工耗时:%f\n\n", (double)(finish - start) / CLOCKS_PER_SEC);
184
185 return 0;
186 }
程序没问题,但是再vs上运行了好久也没运行出来
dfs:马踏棋盘的更多相关文章
- 马踏棋盘--dfs
[问题描述]关于马踏棋盘的基本过程:国际象棋的棋盘为 8*8 的方格棋盘.现将"马"放在任意指定的方格中,按照"马"走棋的规则将"马"进行移 ...
- 马踏棋盘问题-贪心(MATLAB&C++)
原创文章,转载请注明:马踏棋盘问题-贪心(MATLAB&C++) By Lucio.Yang 1.问题描述 将马随机放在国际象棋的Board[0-7][0-7]的某个方格中,马按走棋规则进行移 ...
- 剑指Offer_12_矩阵中的路径(参考问题:马踏棋盘)
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵 ...
- java实现马踏棋盘问题
1.问题描述: 在国际象棋中,马走日,用户输入棋盘的起始位置从x:0-4,y:0-3输出从这一点开始,马走完整个棋盘的各个方案,并输出方案数 2.输入样式: 请输入棋盘马起始位置: 0 0 3.输出样 ...
- C++代码审查---审查孙晓宁马踏棋盘谜题程序
与孙晓宁同学结对审查,其代码地址如下:https://github.com/brunnhilder/-1/blob/master/%E9%A9%AC%E8%B8%8F%E6%A3%8B%E7%9B%9 ...
- python 回溯法 子集树模板 系列 —— 18、马踏棋盘
问题 将马放到国际象棋的8*8棋盘board上的某个方格中,马按走棋规则进行移动,走遍棋盘上的64个方格,要求每个方格进入且只进入一次,找出一种可行的方案. 分析 说明:这个图是5*5的棋盘. 图片来 ...
- 马踏棋盘算法递归+回溯法实现 C语言
r为矩阵的行,c为矩阵的列 将结果输出到当前目录下的results.txt. 结果将给出:1.是否存在路径使马可以按要求走遍所有的方格: 2.解的总数: 3.程序执行的时间: #include< ...
- day53-马踏棋盘
马踏棋盘 1.算法优化的意义 算法是程序的灵魂,为什么有些程序可以在海量数据计算时,依旧保持高速计算? 编程中算法很多,比如八大排序算法(冒泡.选择.插入.快排.归并.希尔.基数.堆排序).查找算法. ...
- 【洛谷】【搜索(dfs)】P3956 棋盘
题目传送门:戳 题目描述: 有一个 \(m * m\) 的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在的位置必须是有颜色 ...
- DFS POJ 1321 棋盘问题
题目传送门 /* DFS:因为一行或一列都只放一个,可以枚举从哪一行开始放,DFS放棋子,同一列只能有一个 */ #include <cstdio> #include <algori ...
随机推荐
- jQuery事件自动触发
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ValueError: Max value is 14 解决方案
方案一(有时会失效): 将EXCEL文件中的格式全部清除即可.最好是复制,然后只粘贴值. 方案二(指定引擎): data = pd.read_excel(path, engine="open ...
- 从read 系统调用到 C10M 问题
一.前言 从上个世纪到现在,工程师们在优化服务器性能的过程中,提出了各种不同的io模型,比如非阻塞io,io复用,信号驱动式io,异步io.具体io模型在不同平台上的实现也不一样,比如io复用在bsd ...
- css美化
编辑网页文本 span标签:能让某几个字凸显出来结构:span{color:red:} <span>123<span> 字体样式:一般设置两个字体.如果浏览器第一个字体不 ...
- 【pandas小技巧】--列值的映射
映射列值是指将一个列中的某些特定值映射为另外一些值,常用于数据清洗和转换. 使用映射列值的场景有很多,以下是几种常见的场景: 将字符串类型的列中的某些值映射为数字.例如,将"男"和 ...
- ros源的移除
在Ubuntu上卸载了ros系统后,每次运行源更新命令 sudo apt update 都会报错,提示ros源找不到等问题. 这时,只需要 cd /etc/apt/souce.list.d sudo ...
- [MAUI]在.NET MAUI中实现可拖拽排序列表
.NET MAUI 中提供了拖放(drag-drop)手势识别器,允许用户通过拖动手势来移动控件.在这篇文章中,我们将学习如何使用拖放手势识别器来实现可拖拽排序列表.在本例中,列表中显示不同大小的磁贴 ...
- [ABC129E] Sum Equals Xor
2023-01-15 题目 题目传送门 翻译 翻译 难度&重要性(1~10):4 题目来源 AtCoder 题目算法 dp/模拟 解题思路 我们都知道,异或是一种不进位的加法,而要想 $ a ...
- 图解Spark Graphx基于connectedComponents函数实现连通图底层原理
原创/朱季谦 第一次写这么长的graphx源码解读,还是比较晦涩,有较多不足之处,争取改进. 一.连通图说明 连通图是指图中的任意两个顶点之间都存在路径相连而组成的一个子图. 用一个图来说明,例如,下 ...
- webgl 刷底色的基本步骤
1.在html中建立画布 <canvas id="canvas"><canvas> 2.在js中获取canvas画布 const canvas = docu ...