【经典算法问题】马的遍历【回溯】
2014-04-08 20:51
344 查看
/*
马的遍历 回溯
在N*M的棋盘中的一点(x,y)开始遍历棋盘所有点
2014-4-8 20:10:48
*/
#include <stdio.h>
#define max 1000
struct Node{
int x, y;
}moveXY[8] = {{1, 2}, {1, -2}, {-1, 2}, {-1, -2},
{2, -1}, {2, 1}, {-2, 1}, {-2, -1}};
bool hasAccess[max][max];
Node store[max];
int n, m, id;
bool checkBound(int x, int y){
if(x < 1 || y < 1 || x > n || y > m) return 0;
return 1;
}
void print(){
for(int i = 1; i <= id; ++i){
if(i % 4 == 0) printf("\n");
printf("(%d, %d) ", store[i].x, store[i].y);
}
printf("\n\n");
}
void backTrack(Node k){
if(id == n * m){
print();
return;
}
Node temp;
for(int i = 0; i < 8; ++i){
if(checkBound(k.x + moveXY[i].x, k.y + moveXY[i].y) &&
!hasAccess[k.x + moveXY[i].x][k.y + moveXY[i].y]){
hasAccess[k.x + moveXY[i].x][k.y + moveXY[i].y] = 1;
temp.x = k.x + moveXY[i].x;
temp.y = k.y + moveXY[i].y;
store[++id] = temp;
backTrack(temp);
--id;
hasAccess[k.x + moveXY[i].x][k.y + moveXY[i].y] = 0;
}
}
}
int main(){
int x, y;
scanf("%d%d", &n, &m);
scanf("%d%d", &x, &y);
Node temp;
temp.x = x; temp.y = y;
store[++id] = temp;
hasAccess[x][y] = 1;
backTrack(temp);
return 0;
}
马的遍历 回溯
在N*M的棋盘中的一点(x,y)开始遍历棋盘所有点
2014-4-8 20:10:48
*/
#include <stdio.h>
#define max 1000
struct Node{
int x, y;
}moveXY[8] = {{1, 2}, {1, -2}, {-1, 2}, {-1, -2},
{2, -1}, {2, 1}, {-2, 1}, {-2, -1}};
bool hasAccess[max][max];
Node store[max];
int n, m, id;
bool checkBound(int x, int y){
if(x < 1 || y < 1 || x > n || y > m) return 0;
return 1;
}
void print(){
for(int i = 1; i <= id; ++i){
if(i % 4 == 0) printf("\n");
printf("(%d, %d) ", store[i].x, store[i].y);
}
printf("\n\n");
}
void backTrack(Node k){
if(id == n * m){
print();
return;
}
Node temp;
for(int i = 0; i < 8; ++i){
if(checkBound(k.x + moveXY[i].x, k.y + moveXY[i].y) &&
!hasAccess[k.x + moveXY[i].x][k.y + moveXY[i].y]){
hasAccess[k.x + moveXY[i].x][k.y + moveXY[i].y] = 1;
temp.x = k.x + moveXY[i].x;
temp.y = k.y + moveXY[i].y;
store[++id] = temp;
backTrack(temp);
--id;
hasAccess[k.x + moveXY[i].x][k.y + moveXY[i].y] = 0;
}
}
}
int main(){
int x, y;
scanf("%d%d", &n, &m);
scanf("%d%d", &x, &y);
Node temp;
temp.x = x; temp.y = y;
store[++id] = temp;
hasAccess[x][y] = 1;
backTrack(temp);
return 0;
}
相关文章推荐
- 【经典算法】:最长公共子序列(LCS问题,用遍历实现)
- 经典回溯算法之n皇后问题
- 经典问题的回溯算法
- 算法入门经典 7.4.4 带宽问题 回溯 剪枝
- 【算法入门经典】7.4回溯法【八皇后问题】
- LeetCode | 52. N-Queens II 经典算法n后问题回溯法
- 经典回溯算法之N皇后问题
- C++搜索与回溯算法之马走日(遍历问题)
- 回溯经典算法之四皇后问题
- 回溯算法经典应用之—迷宫问题 (Java)
- 【C/C++】回溯经典算法之-->八皇后问题
- DP DAG 9-3硬币问题(算法竞赛入门经典p162)
- 算法--回溯法与具体问题
- 回溯算法经典应用:迷宫求解
- 回溯算法之N皇后问题
- 经典算法问题的Java实现
- 巩固基础篇:八皇后问题:经典回溯法
- 【基础算法】M叉树的遍历问题(BZOJ1185)
- 国际象棋“皇后”问题的回溯算法
- 软件设计师算法之回溯法--8皇后问题