您的位置:首页 > 其它

回溯法解决马步遍历问题

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: