您的位置:首页 > 其它

马遍历棋盘算法

2010-10-16 16:50 106 查看
一. 问题的提出:
马的遍历问题。在N×N方格的棋盘上,从任意指定方格出发,为马寻找一条走遍棋盘每一格并且只经过一次的一条路径。



// HorseBoard.cpp : 定义控制台应用程序的入口点。
//马儿走满棋盘的算法~ 1为起点,0为终点。
#include "stdafx.h"
#include<iostream>
#include"MArray.h"
using namespace std;
int ** Horse(int **p,int n,int i,int j);
int Count(int **p,int n,int i,int j,int*,int*);
int Step=1;
void main()
{
int n,i,j,**p;
cout<<"请输入棋盘大小";
cin>>n;
MArray H(n);
p=H.CreateMArray();//棋盘建立完毕。
cout<<"请输入Horse的初始位置:";
cin>>i>>j;
p=Horse(p,n,i,j);
H.ChangeMArray(p);//用更改后的棋盘代替原成员。
H.printArray();//打印地图。
}

int ** Horse(int **p,int n,int i,int j)
{
int a[8],w,v=9,l;
int Pos_i[]={2,1,-1,-2,-2,-1,1,2};//x轴上坐标变化,左负右正。
int Pos_j[]={1,2,2,1,-1,-2,-2,-1};//y轴上坐标变化,下负上正。
p[i-1][j-1]=Step;//即第一个位置。
for(w=0;w<8;w++)
{
if(0<=i+Pos_i[w]-1&&i+Pos_i[w]-1<n&&0<=j+Pos_j[w]-1&&j+Pos_j[w]-1<n&&p[i+Pos_i[w]-1][j+Pos_j[w]-1]==0)
//如果以i为父节点的8个子节点在棋盘里面且节点没有被踩踏。
//其实Count函数中也有限制条件,但为防止跳出又跳进,必须用两次同样的限制。
a[w]=Count(p,n,i+Pos_i[w],j+Pos_j[w],Pos_i,Pos_j);//调用Count函数计算孙子节点个数。
else
a[w]=0;//不满足的话,一定要设为0,否则Default为-858993460。
if(a[w]&&a[w]<v)//擂台法排序。
{
v=a[w];
l=w;
}
}
Step++;
if(Step==n*n)
return p;
p[i+Pos_i[l]-1][j+Pos_j[l]-1]=Step;
Horse(p,n,i+Pos_i[l],j+Pos_j[l]);//递归调用。

}

int Count(int **p,int n,int i,int j,int *Pos_i,int *Pos_j)
{
int k,Num=0;
for(k=0;k<8;k++)
{
if(0<=i+Pos_i[k]-1&&i+Pos_i[k]-1<n&&0<=j+Pos_j[k]-1&&j+Pos_j[k]-1<n&&p[i+Pos_i[k]-1][j+Pos_j[k]-1]==0)
Num++;
}
return Num;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: