算法设计与分析题目练习三:骑士旅游问题(回溯算法)
2016-12-23 20:19
1166 查看
题目:
问题描述:在一个N*N 格子的棋盘上,有一只国际象棋的骑士在棋盘的左下角,骑士只能根据象棋的规则进行移动, 要么横向跳动一格纵向跳动两格,要么纵向跳动一格横向跳动两格。骑士从第一个格子出发,每个格子只能访问一次,能否访问完所有的格子, 请找到一个解决方案。
问题描述:在一个N*N 格子的棋盘上,有一只国际象棋的骑士在棋盘的左下角,骑士只能根据象棋的规则进行移动, 要么横向跳动一格纵向跳动两格,要么纵向跳动一格横向跳动两格。骑士从第一个格子出发,每个格子只能访问一次,能否访问完所有的格子, 请找到一个解决方案。
#include <iostream> using namespace std; /************************************************************************/ /* 问题描述:在一个N*N 格子的棋盘上,有一只国际象棋的骑士在棋盘的左下角,骑士只能根据象棋的规则进行移动, 要么横向跳动一格纵向跳动两格,要么纵向跳动一格横向跳动两格。骑士从第一个格子出发,每个格子只能访问 一次,能否访问完所有的格子, 请找到一个解决方案。 */ /************************************************************************/ #define N 8 bool backtracking(int x, int y, int cnt); int isSafe(int x, int y, int solution ) { if (x >= 0 && x < N && y >= 0 && y < N && solution[x][y] == -1) return 1; return 0; } /* 打印数组sol */ void printSolution(int sol ) { printf("find one solution :\n"); for (int x = 0; x < N; x++) { for (int y = 0; y < N; y++) printf(" %2d ", sol[x][y]); printf("\n"); } } //存储解决方案 int solution ; //马跳八方,共有8中走法 int xMove[8] = { 2, 1, -1, -2, -2, -1, 1, 2 }; int yMove[8] = { 1, 2, 2, 1, -1, -2, -2, -1 }; bool KnightTour() { /* 初始化 */ for (int x = 0; x < N; x++) for (int y = 0; y < N; y++) solution[x][y] = -1; if (backtracking(0, 0, 1) == false) { printf("Solution does not exist"); return false; } else printSolution(solution); return true; } bool backtracking(int x, int y, int cnt){ //存储访问记录 solution[x][y] = cnt; //访问完所有的格子 if (cnt == N*N){ return true; } int next_x, next_y; //一次尝试所有可以移动的格子 for (int i = 0; i < 8; i++){ next_x = x + xMove[i]; next_y = y + yMove[i]; //判断该格子是否可以访问 if (isSafe(next_x, next_y, solution)){ //找到解决方案 就直接返回 if (backtracking(next_x, next_y, cnt + 1) == true) return true; } } solution[x][y] = -1; //回溯操作. 未找到解决方案 return false; } int main() { KnightTour(); system("pause"); return 0; }
相关文章推荐
- 算法设计与分析题目练习三:骑士旅游问题(回溯算法)
- 算法设计与分析题目练习五:求最大值(遗传算法)
- 【算法设计与分析】7、0/1背包问题,动态规划
- 算法设计分析: 埃及分数问题
- 计算机算法设计与分析之棋盘覆盖问题
- 算法分析与设计-09- 0-1背包问题
- 【算法分析与设计】最小生成树问题
- 算法分析与设计——矩阵连乘问题
- 【算法设计与分析】输油管道问题
- 【算法设计与分析】递归与分治----2.4 排列问题
- 算法设计与分析--01背包问题(动态规划法解决)
- 统计数字问题[算法设计与分析]
- 用递归法:设计算法求解汉诺塔问题,并编程实现。 (1) Hanoi(汉诺)塔问题分析 这是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座 A,B,C
- [算法]图算法之骑士遍历问题(象棋中马的遍历问题)分析,C语言实现
- 算法分析与设计矩阵连乘问题
- 算法设计与分析--小算法问题总结
- 动态规划法之投资问题_算法分析与设计
- 算法设计与分析--矩阵连乘顺序问题…
- 算法分析与设计-13-活动安排问题的贪心算法
- 计算机算法设计与分析作业01:分治法求解大数乘法+L型骨牌的棋盘覆盖问题