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 ...
随机推荐
- PyQt5调用主窗口
import sysfrom ui.MainWindow import Ui_Form from PyQt5.QtWidgets import QApplication, QMainWindowcla ...
- linux下的venv使用
首先安装该模块: sudo apt-get install python3-venv 之后创建用于存储工程的文件夹 mkdir [filename] 创建环境: python3 -m venv ven ...
- 文件上传的multipart/form-data属性,你理解了吗
form表单经常用于前端发送请求,比如:用户填写信息.选择数据.上传文件,对于不同的场景,上传数据的格式也会有些区别. action action 表示该请求的 url 地址,定义在form上,请求的 ...
- python实现创建一个银行类,这个类实现了两个方法,第一个方法可以将用户信息写入到文件中,第二个方法可以读取文件中的用户信息出来
class bank: def user_info(self): a=input('请输入用户信息:') # 不写encoding = 'utf-8'中文会乱码 with open('info.txt ...
- FastJson不成想还有个版本2啊:序列化大字符串报错
背景 发现陷入了一个怪圈,写文章的话,感觉只有大bug或比较值得写的内容才会写,每次一写就是几千字,争取写得透彻一些,但这样,我也挺费时间,读者也未必有这么多时间看. 我想着,日常遇到的小bug.平时 ...
- Jmeter插件PerfMon Metrics Collector安装使用及报错解决
Jmeter作为一个轻量级的性能测试工具,开源.小巧.灵活的特性使其越来越受到测试人员喜爱.在实际的 项目中,特别是跨地区项目,排除合作方指定要求使用Loadrunner作为性能测试工具外,Jmete ...
- 详解 canal 同步 MySQL 增量数据到 ES
canal 是阿里知名的开源项目,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费. 这篇文章,我们手把手向同学们展示使用 canal 将 MySQL 增量数据同步到 ES . ...
- Solution Set -「CF 1486」
「CF 1486A」Shifting Stacks Link. 考虑最少需要操作多少次后判断. #include<map> #include<cstdio> using nam ...
- elmentui表单重置初始值问题与解决方法
背景 在做管理台项目时,我们会经常使用到表单+表格+弹窗表单的组合,以完成对数据的增.删.查.改. 在vue2+elementui项目中,使用弹窗dialog+表单form,实现对数据的添加和修改. ...
- 08-03_阅读flask上下文前夕补充、flask请求上下文、数据库连接池
文章目录 阅读flask上下文前夕补充 01 偏函数 02 __add__的使用 03 chain函数 2 flask请求上下文 1 首先分析请求上下文对象(ctx)创立 2 把请求对象(ctx)添加 ...