转:数据结构与算法1:马踏棋盘问题(骑士周游问题)
来源:互联网 发布:程序员接私活赚钱吗 编辑:程序博客网 时间:2024/05/18 22:16
问题描述:在一个国际象棋的棋盘上,一个马按照它的规则如何才能从一个点出发遍历每一个位置,且每个点只访问一次。
问题分析:这是一个深搜的问题,沿着一条路前进直到遍历全部的点,那就完成了整个的过程。如果不行,就回退一步,换个方向继续前进。这可以用递归很方便地实现。注意到马在某个位置最多有8个方向可以走,因此需要对这8个方向进行试探。当然这8个方向不一定都存在,比如在边缘可能就会少一些。考虑到实际8*8的棋盘计算量比较大,我们使用6*6代替。
- #include <stdio.h>
- #define N 6
- int chess[N][N];
- int next(int* x, int* y, int dir)
- {
- switch(dir)
- {
- case 1:
- if (*x+1 < N && *y-2 >= 0 && chess[*x+1][*y-2] == 0)
- {
- *x += 1;
- *y -= 2;
- return 1;
- }
- break;
- case 2:
- if (*x+2 < N && *y-1 >= 0 && chess[*x+2][*y-1] == 0)
- {
- *x += 2;
- *y -= 1;
- return 1;
- }
- break;
- case 3:
- if (*x+2 < N && *y+1 < N && chess[*x+2][*y+1] == 0)
- {
- *x += 2;
- *y += 1;
- return 1;
- }
- break;
- case 4:
- if (*x+1 < N && *y+2 < N && chess[*x+1][*y+2] == 0)
- {
- *x += 1;
- *y += 2;
- return 1;
- }
- break;
- case 5:
- if (*x-1 >= 0 && *y+2 < N && chess[*x-1][*y+2] == 0)
- {
- *x -= 1;
- *y += 2;
- return 1;
- }
- break;
- case 6:
- if (*x-2 >= 0 && *y+1 < N && chess[*x-2][*y+1] == 0)
- {
- *x -= 2;
- *y += 1;
- return 1;
- }
- break;
- case 7:
- if (*x-2 >= 0 && *y-1 >= 0 && chess[*x-2][*y-1] == 0)
- {
- *x -= 2;
- *y -= 1;
- return 1;
- }
- break;
- case 8:
- if (*x-1 >= 0 && *y-2 >= 0 && chess[*x-1][*y-2] == 0)
- {
- *x -= 1;
- *y -= 2;
- return 1;
- }
- break;
- }
- return 0;
- }
- int search(int x, int y, int now)
- {
- int x1=x, y1=y;
- chess[x][y] = now;
- if (now == N*N)
- return 1;
- if (next(&x1, &y1, 1))
- {
- if (search(x1, x2, now+1))
- {
- return 1;
- }
- }
- if (next(&x1, &y1, 2))
- {
- if (search(x1, x2, now+1))
- {
- return 1;
- }
- }
- if (next(&x1, &y1, 3))
- {
- if (search(x1, x2, now+1))
- {
- return 1;
- }
- }
- if (next(&x1, &y1, 4))
- {
- if (search(x1, x2, now+1))
- {
- return 1;
- }
- }
- if (next(&x1, &y1, 5))
- {
- if (search(x1, x2, now+1))
- {
- return 1;
- }
- }
- if (next(&x1, &y1, 6)
- {
- if (search(x1, x2, now+1))
- {
- return 1;
- }
- }
- if (next(&x1, &y1, 7))
- {
- if (search(x1, x2, now+1))
- {
- return 1;
- }
- }
- if (next(&x1, &y1, 8))
- {
- if (search(x1, x2, now+1))
- {
- return 1;
- }
- }
- chess[x][y] = 0;
- return 0;
- }
- int main()
- {
- search(0, 0, 1);
- return 0;
- }
0 0
- 转:数据结构与算法1:马踏棋盘问题(骑士周游问题)
- 数据结构与算法10:马踏棋盘问题(骑士周游问题)
- 马踏棋盘算法(骑士周游问题)
- 马踏棋盘算法(骑士周游问题)
- 马踏棋盘算法(骑士周游问题)
- 马踏棋盘算法(骑士周游问题)
- 马踏棋盘算法(骑士周游问题)
- C语言-数据结构-骑士周游-马踏棋盘问题-源代码
- 马踏棋盘算法 [骑士周游问题] --->图
- 15骑士周游问题(马踏棋盘问题)
- 骑士周游问题(马踏棋盘问题)DFS
- 马踏棋盘问题(骑士周游问题)及其优化算法java实现
- C++ 马踏棋盘(骑士周游)
- 骑士周游问题
- 跳马问题(骑士周游问题)初探
- 跳马问题(骑士周游问题)初探
- 数据结构学习之启发式搜索求解骑士周游问题
- 骑士旅行问题(骑士走棋盘)
- Android新浪微博客户端(四)——添加多个账户及认证
- 转载:二叉查找树原理分析及查找、插入、删除、遍历实现
- 关于键保留表的一些汇总
- TestLink 安装时遇到问题
- 2014-05-15 一个刚进入code世界的屌丝
- 转:数据结构与算法1:马踏棋盘问题(骑士周游问题)
- 增量式编码器的工作原理与使用方法
- 动易网络 - 移动互联网时代网站建设领域的研究者与引领者
- Unity3D 物体旋转之Quaternion.Slerp
- iOS之Object-C基础编程之NSArray和NSMutableArray
- 增量式旋转编码器工作原理
- Unity3D Quaternion各属性和函数测试
- 连载:面向对象葵花宝典:思想、技巧与实践(23) - 领域建模三字经
- [LeetCode] Unique Binary Search Trees II