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. pandas 格式化日期

    output_data["ShipDate"] = output_data["ShipDate"].dt.strftime("%Y/%m/%d&quo ...

  2. Go函数可以返回多个值

    1 package main 2 3 import "fmt" 4 5 func swap(x, y string) (string, string){ 6 return y,x ...

  3. MIT6.s081/6.828 lectrue5/6:System call entry/exit 以及 Lab4 心得

    这篇博客主要复习 lecture05:GDB calling conentions 和 lecture06:System call entry/exit 的内容,外加 Lab4:traps 的心得 前 ...

  4. iOS越狱后必装软件

    iOS越狱后就跟ubuntu没两样了,很多ubuntu下常用的软件都要装一下 openssh 这个软件可以让我们能够登录iphone Apt-get 用这个软件可以安装很多软件,主要是一些工具调试类软 ...

  5. doris建表报错 errCode = 2, detailMessage = Scale of decimal must between 0 and 9. Scale was set to: 10

    doris建表报错 问题背景 当我从Mpp库向doris库中导数据时,需要先创建对应的数据表,将Mpp库中表的建表语句略作修改后,在doris服务器上运行 CREATE TABLE opt_conne ...

  6. Prometheus + Grafana 搭建监控系统

    前言 本文主要记录下如何使用 Prometheus + Grafana 搭建对各种服务的性能监控,涵盖对 Prometheus.Grafana 的基本介绍,以及如何使用二者进行对 Linux.MySQ ...

  7. 连接远程MySQL报错问题-Datagrip

    前言: 记录:DataGrip连接远程服务器MySQL数据库报错问题. 问题: 1.Communications link failure--会话连接失败 原因分析: 1.端口被防火墙了 2.MySQ ...

  8. Python基础知识——函数的基本使用、函数的参数、名称空间与作用域、函数对象与闭包、 装饰器、迭代器、生成器与yield、函数递归、面向过程与函数式(map、reduce、filter)

    文章目录 1 函数的基本使用 一 引入 二 定义函数 三 调用函数与函数返回值 2 函数的参数 一 形参与实参介绍 二 形参与实参的具体使用 2.1 位置参数 2.2 关键字参数 2.3 默认参数 2 ...

  9. 造轮子之EventBus

    前面基础管理的功能基本开发完了,接下来我们来优化一下开发功能,来添加EventBus功能.EventBus也是我们使用场景非常广的东西.这里我会实现一个本地的EventBus以及分布式的EventBu ...

  10. 安装OpenStack的yum源

    # yum install https://buildlogs.centos.org/centos/7/cloud/x86_64/openstack-liberty/centos-release-op ...