马遍历棋盘算法

.             问题的提出:

马的遍历问题。在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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值