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 ...
随机推荐
- git: failed to push some refs to
错误原因 没有添加readme文件 解决方案 git pull --rebase origin master 至此问题解决
- zanePerfor中一套简单通用的Node前后端Token登录机制和github授权登录方式
HI!,你好,我是zane,zanePerfor是一款我开发的一个前端性能监控平台,现在支持web浏览器端和微信小程序端. 我定义为一款完整,高性能,高可用的前端性能监控系统,这是未来会达到的目的,现 ...
- 【干货】浅谈如何给.net程序加多层壳达到1+1>2的效果
软件破解分白盒和黑盒两种方式. 白盒破解:白盒破解是指对软件进行破解时,攻击者可以访问软件的内部结构和源代码.这种破解方式通常发生在软件的开发者.技术人员或软件公司内部.攻击者使用这些详细信息来理解软 ...
- [mysql]定制封装MySQL的docker镜像
前言 基于MySQL的原版镜像做一些个性化配置修改,封装/etc/my.cnf文件到镜像中,并且支持通过环境变量修改innodb_buffer_pool_size.server_id以及自动配置inn ...
- doris单机安装部署
原文出处 doris单机安装部署 下载Doris 环境要求 Linux系统:Centos7.x或Ubantu16.04及以上版本 Java运行环境: JDK8 java -version 在windo ...
- CodeForces 1367F2 Flying Sort (Hard Version)
题意 给一个长度为\(n\)的数组,你可以有两种操作 将某一个数放置在数组开头 将某一个数放置在数组结尾 问最小操作多少次可以得到一个非递减数列 (比\(F1\)难在\(n\)变大,且数组中元素可以有 ...
- KRPANO资源分析工具下载VR-FACTORY全景图
示:目前分析工具中的全景图下载功能将被极速全景图下载大师替代,相比分析工具,极速全景图下载大师支持更多的网站(包括各类KRPano全景网站,和百度街景) 详细可以查看如下的链接: 极速全景图下载大师官 ...
- 图解Spark排序算子sortBy的核心源码
原创/朱季谦 一.案例说明 以前刚开始学习Spark的时候,在练习排序算子sortBy的时候,曾发现一个有趣的现象是,在使用排序算子sortBy后直接打印的话,发现打印的结果是乱序的,并没有出现完整排 ...
- Solution -「洛谷 P5048」「YunoOI 2019 模拟赛」Yuno loves sqrt technology III
Description Link. 区间众数出现次数强制在线. Solution 三个 YLST 中比较清新的一个分块. 比较重点的地方在于询问散块的处理. 先离散化一下序列. 我们首先预处理出来一个 ...
- Docker Swarm + Harbor + Portainer 打造高可用,高伸缩,集群自动化部署,更新。
Docker Swarm是Docker官方自带的容器编排工具,Swarm,Compose,Machine合称Docker三剑客.Docker Swarm对于中小型应用来说,还是比较方便,灵活,当然K8 ...