马的Hamilton周游路线问题
来源:互联网 发布:快速傅里叶变换 知乎 编辑:程序博客网 时间:2024/05/21 01:51
#include "iostream"#include "iomanip"#include "cstdlib"using namespace std;int board[100][100];int dx[8] = {-2, -1, 1, 2, -2, -1, 2, 1}; //马可走的八个方向int dy[8] = {-1, -2, -2, -1, 1, 2, 1, 2};int n, m; //棋盘为m * nint startx, starty; //马的起点坐标//如果坐标出界,或该棋盘格已走过,则返回0,否则返回1int ok(int x, int y){ if(x<1 || y<1 || x>m || y>n || board[x][y]!=0) return 0; return 1;}//打印路线void print(int n, int m){ for(int i=1; i<=m; i++) { for(int j=1; j<=n; j++) cout << setw(3) << board[i][j]; cout << endl; }}int restart(int x, int y) //判断下一步是否可以回到起点{ for(int i=0; i<8; i++) if(x+dx[i]==startx && y+dy[i]==starty) return 1; return 0;}void backtrack(int x, int y, int count){ if(count == n * m && restart(x, y)) //如果走完棋盘,且回到起点 { print(n, m); exit(1); } for(int i=0; i<8; i++) //每到一个格子,都有八个方向 { int xx = x + dx[i]; int yy = y + dy[i]; if(ok(xx, yy)) //如果坐标正常 { board[xx][yy] = count + 1; backtrack(xx, yy, count + 1); board[xx][yy] = 0; //回溯 } }}int main(){ cout << "输入棋盘行数:"; cin >> m; cout << "输入棋盘列数:"; cin >> n; memset(board, 0, sizeof(board)); cout << "输入马的起始坐标:"; cin >> startx >> starty; board[startx][starty] = 1; int number = 1; cout << "路线为:\n"; backtrack(startx, starty, number); return 0;}
1 1
- 马的Hamilton周游路线问题
- 马的Hamilton周游路线问题
- 马的Hamilton周游路线问题
- 马的Hamilton周游路线
- 马的Hamilton周游问题,O(N)解决,N表棋盘规模
- 求解马的周游路线
- 马的周游问题
- 1153. 马的周游问题
- 简单的马周游问题
- 1153. 马的周游问题
- 1153. 马的周游问题
- 1153 马的周游问题
- sicily 1152 简单的马周游问题
- sicily 1153 马的周游问题
- Sicily 1152 简单的马周游问题
- Sicily 1153 马的周游问题
- sicily 1153 马的周游问题
- sicily 1152 简单的马周游问题
- Skynet 源码学习 -- 二级消息队列,Worker 工作线程池, Monitor 。
- 二叉树算法验证(4)哈夫曼树
- Ubuntu下使用wireshark进行网络抓包
- 支付宝SDK
- 实际应用中,如何管理多个Activity?
- 马的Hamilton周游路线问题
- SSH整合教程(struts2+spring3+hibernate3)(含登陆示例)
- Oracle函数汇总
- 第十周实践项目2 二叉树遍历的递归算法
- 栈和队列2 – 数据结构和算法24
- kindeditor取不到textarea的值的解决办法
- java获取当前时间、当前零点零分零秒、昨天这一时间
- activemq 三种索引的使用分析
- json java javabean xml 之相互转换 适合初学者