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:马踏棋盘的更多相关文章

  1. 马踏棋盘--dfs

    [问题描述]关于马踏棋盘的基本过程:国际象棋的棋盘为 8*8 的方格棋盘.现将"马"放在任意指定的方格中,按照"马"走棋的规则将"马"进行移 ...

  2. 马踏棋盘问题-贪心(MATLAB&C++)

    原创文章,转载请注明:马踏棋盘问题-贪心(MATLAB&C++) By Lucio.Yang 1.问题描述 将马随机放在国际象棋的Board[0-7][0-7]的某个方格中,马按走棋规则进行移 ...

  3. 剑指Offer_12_矩阵中的路径(参考问题:马踏棋盘)

    题目描述  请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵 ...

  4. java实现马踏棋盘问题

    1.问题描述: 在国际象棋中,马走日,用户输入棋盘的起始位置从x:0-4,y:0-3输出从这一点开始,马走完整个棋盘的各个方案,并输出方案数 2.输入样式: 请输入棋盘马起始位置: 0 0 3.输出样 ...

  5. C++代码审查---审查孙晓宁马踏棋盘谜题程序

    与孙晓宁同学结对审查,其代码地址如下:https://github.com/brunnhilder/-1/blob/master/%E9%A9%AC%E8%B8%8F%E6%A3%8B%E7%9B%9 ...

  6. python 回溯法 子集树模板 系列 —— 18、马踏棋盘

    问题 将马放到国际象棋的8*8棋盘board上的某个方格中,马按走棋规则进行移动,走遍棋盘上的64个方格,要求每个方格进入且只进入一次,找出一种可行的方案. 分析 说明:这个图是5*5的棋盘. 图片来 ...

  7. 马踏棋盘算法递归+回溯法实现 C语言

    r为矩阵的行,c为矩阵的列 将结果输出到当前目录下的results.txt. 结果将给出:1.是否存在路径使马可以按要求走遍所有的方格: 2.解的总数: 3.程序执行的时间: #include< ...

  8. day53-马踏棋盘

    马踏棋盘 1.算法优化的意义 算法是程序的灵魂,为什么有些程序可以在海量数据计算时,依旧保持高速计算? 编程中算法很多,比如八大排序算法(冒泡.选择.插入.快排.归并.希尔.基数.堆排序).查找算法. ...

  9. 【洛谷】【搜索(dfs)】P3956 棋盘

    题目传送门:戳 题目描述: 有一个 \(m * m\) 的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在的位置必须是有颜色 ...

  10. DFS POJ 1321 棋盘问题

    题目传送门 /* DFS:因为一行或一列都只放一个,可以枚举从哪一行开始放,DFS放棋子,同一列只能有一个 */ #include <cstdio> #include <algori ...

随机推荐

  1. 记一次 .NET 某物流API系统 CPU爆高分析

    一:背景 1. 讲故事 前段时间有位朋友找到我,说他程序CPU直接被打满了,让我帮忙看下怎么回事,截图如下: 看了下是两个相同的程序,既然被打满了那就抓一个 dump 看看到底咋回事. 二:为什么会打 ...

  2. ArcMap时间滑块绘制遥感影像的动态变化过程

      本文介绍基于ArcMap软件,利用时间滑块功能,对大量多时相栅格遥感影像数据进行动态显示,并生成视频或动图的方法.   首先,我们需要在ArcMap软件中新建一个镶嵌数据集,并将全部的多时像遥感影 ...

  3. React Router 6 快速上手

    1.概述 React Router 以三个不同的包发布到 npm 上,它们分别为: react-router: 路由的核心库,提供了很多的:组件.钩子. react-router-dom: 包含rea ...

  4. 三维模型OBJ格式轻量化压缩处理的数据质量提升方法分析

    三维模型OBJ格式轻量化压缩处理的数据质量提升方法分析 在三维模型的OBJ格式轻量化压缩处理过程中,除了减小文件大小和提高加载速度之外,我们也需要考虑如何提升数据质量.以下是几种常见的方法: 1.优化 ...

  5. 深入探究API接口

    作为程序员,我们经常会遇到需要获取外部数据或调用外部服务的情况.而API(Application Programming Interface,应用程序编程接口)接口就是这样的一种机制,它允许我们的应用 ...

  6. mysql8关闭binlog并清空Binlog

    编辑my.ini或者my.cnf文件 清空binlog信息 #查看现存的binlog文件列表 show master logs; #重置清空binlog文件 reset master; #重置清空后 ...

  7. SICTF-2023 #Round2-WP-Crypto | Misc

    Crypto 一.[签到]古典大杂烩 附件信息: 很明显可以看出来是base100,密码工具箱一把梭: SICTF{fe853b49-8730-462e-86f5-fc8e9789f077} 二.Ra ...

  8. MySQL 分表查询

    分表是一种数据库分割技术,用于将大表拆分成多个小表,以提高数据库的性能和可管理性.在MySQL中,可以使用多种方法进行分表,例如基于范围.哈希或列表等.下面将详细介绍MySQL如何分表以及分表后如何进 ...

  9. Ds100p -「数据结构百题」1~10

    1.「一本通 4.6 例 1」营业额统计 原题来自:HNOI 2002 Tiger 最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger 拿出 ...

  10. 【matplotlib基础】--结合地图

    如果分析的数据与地域相关,那么,把分析结果结合地图一起展示的话,会让可视化的效果得到极大的提升. 比如,分析各省GDP数据,人口数据,用柱状图,饼图之类的虽然都可以展示分析结果,不过,如果能在全国的地 ...