回溯法解决马步遍历问题
2009-08-31 20:44
375 查看
设计一算法,求解国际象棋中的马的周游问题:给定一8×8的棋盘,马从棋盘的某个位置出发,经过棋盘中的每一个方格恰好一次。(只需求一可行解)
一、 算法思想描述
指定一个起点坐标,从起点开始对每个点遍历其能到达的八方向上的点,如果可以踩则走到该结点上,并继续深入遍历,直到最后走完所有的结点。
二、 完整的程序以及说明
Code:
#include<iostream>
using namespace std;
// 棋盘大小
#define N 8
// 八方向
#define DIR 8
int dir[DIR][2] = { {2,1}, {1,2}, {-1,2}, {-2,1}, {-2,-1}, {-1,-2}, {1,-2}, {2,-1} };
int mz
;
bool flag;
int sx, sy;
/**
* 遍历算法
* 输入: 起点坐标
*/
void chess(int x, int y, int t){
// 标记这格走完了
mz[x][y] = t;
// 走完N*N格
if(t==N*N){
// 标记找到了路径
flag = true;
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
printf("%5d", mz[i][j]);
}
putchar('/n');
}
return;
}
// 八方向可以走到的格子
for(int i=0; i<DIR&&!flag; i++){
int tx = x+dir[i][0];
int ty = y+dir[i][1];
// 如果存在该格并且没走过
if(tx>=0&&tx<N&&ty>=0&&ty<N&&!mz[tx][ty]){
// 走进去
chess(tx,ty,t+1);
}
}
// 还原状态
mz[x][y] = 0;
}
int main(){
int x,y;
memset(mz,0,sizeof(mz));
cout<<"请输入起点坐标(从(1,1)至("<<N<<","<<N<<")):";
cin>>x>>y;
x--, y--;
sx = x, sy = y;
// 寻路标记置为false
flag = false;
// 从(x,y)开始寻路
chess(x,y,1);
if(!flag)puts("找不到可行路径!");
return 0;
}
一、 算法思想描述
指定一个起点坐标,从起点开始对每个点遍历其能到达的八方向上的点,如果可以踩则走到该结点上,并继续深入遍历,直到最后走完所有的结点。
二、 完整的程序以及说明
Code:
#include<iostream>
using namespace std;
// 棋盘大小
#define N 8
// 八方向
#define DIR 8
int dir[DIR][2] = { {2,1}, {1,2}, {-1,2}, {-2,1}, {-2,-1}, {-1,-2}, {1,-2}, {2,-1} };
int mz
;
bool flag;
int sx, sy;
/**
* 遍历算法
* 输入: 起点坐标
*/
void chess(int x, int y, int t){
// 标记这格走完了
mz[x][y] = t;
// 走完N*N格
if(t==N*N){
// 标记找到了路径
flag = true;
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
printf("%5d", mz[i][j]);
}
putchar('/n');
}
return;
}
// 八方向可以走到的格子
for(int i=0; i<DIR&&!flag; i++){
int tx = x+dir[i][0];
int ty = y+dir[i][1];
// 如果存在该格并且没走过
if(tx>=0&&tx<N&&ty>=0&&ty<N&&!mz[tx][ty]){
// 走进去
chess(tx,ty,t+1);
}
}
// 还原状态
mz[x][y] = 0;
}
int main(){
int x,y;
memset(mz,0,sizeof(mz));
cout<<"请输入起点坐标(从(1,1)至("<<N<<","<<N<<")):";
cin>>x>>y;
x--, y--;
sx = x, sy = y;
// 寻路标记置为false
flag = false;
// 从(x,y)开始寻路
chess(x,y,1);
if(!flag)puts("找不到可行路径!");
return 0;
}
相关文章推荐
- 回溯法解决马步问题
- 回溯法解决01背包问题
- Python基于回溯法子集树模板解决野人与传教士问题示例
- 回溯法解决N皇后问题
- Python使用回溯法子集树模板解决爬楼梯问题示例
- 回溯法解决 排列组合问题 全排 选排 可重复 不可重复
- C#使用回溯法解决背包问题实例分析
- 回溯法解决四皇后问题
- 第九周项目三__利用二叉数遍历思想解决问题
- 回溯法解决组合与数的问题(递归与非递归算法)
- “马的遍历”问题的贪婪法解决算法
- 用试探回溯法解决N皇后问题
- C++基于回溯法解决八皇后问题示例
- Python遍历zip文件输出名称时出现乱码问题的解决方法
- 使用Map传值,解决多维数据结构的遍历问题
- “马的遍历”问题的贪婪法解决算法
- 回溯法解决迷宫问题
- 回溯法解决装载问题
- 回溯法解决N皇后问题(以四皇后为例)
- 解答树问题可分为子集生成和排列生成问题,都可以用回溯法解决并且是很优化的方案