马遍历棋盘算法
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;
}
马的遍历问题。在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;
}
相关文章推荐
- 图的遍历算法-马遍历棋盘
- 图的遍历算法-马遍历棋盘
- 马遍历棋盘高效算法(10*10),10*10以下的棋盘基本可以迅速计算出结果。
- java二叉树的遍历算法
- 队列中入队,出队,遍历算法代码演示
- 算法-二叉树的前中后遍历stack版
- 棋盘覆盖问题、半数集问题算法解析-C语言
- 兵棋---棋盘绘制算法(六边形阵列算法)
- [算法与数据结构] - No.7 二叉树建立及其前序、中序、后序遍历
- 马踏棋盘算法 [骑士周游问题] --->图
- 算法提高 棋盘多项式
- 二叉树的各种遍历算法C++实现
- 算法1:遍历二叉树的递归算法
- 数据结构链表创建,遍历,是否为空,求长度,插入,删除算法的演示
- 第11周 项目1 - 二叉树算法验证—层次遍历算法的验证
- 递归遍历某文件夹下所有文件的算法
- 经典算法之图的深度优先搜索遍历
- 【数据结构与算法】二叉树的层序遍历
- 第10周项目1-验证算法(1)层次遍历算法的验证
- 第十周【项目1 - 二叉树算法验证】之层次遍历算法的验证