马的遍历

问题描述:

国际象棋或中国象棋中,在棋盘上,从任意指定的方格出发,为马寻找一条路径使马能走遍棋盘每一格并且每格只经过一次。 

分析:

如果是使用深度优先搜索+回溯,时间复杂度高,这里我们需要一种更高效的算法。使用贪心的思想,在每个结点对其子结点进行选取时,优先选择子节点可落子位置最少的结点。可落子位置意思是下一步能走到得位置,如:

马口口口口
口口口口口
口口口口口
口口口口口

它的可落子位置为2。

/*
马的遍历
*/

#include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
using namespace std;

class Pos
{
public:
    int x;
    int y;
    Pos(int x, int y):x(x),y(y){}
};
vector<Pos> store;	   //用于存储路径

//棋盘数据:
const int WIDTH = 9;       //棋盘宽和高
const int HEIGHT = 10;
int board[WIDTH+1][HEIGHT+1];  //棋盘数组保存数据为每个位置对应马的路线的第几步

//dir为马的八个方向
const int dir[8][2] = {
  {-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2}};

//求(i,j)位置的出口,并返回所有出口和对应的出口个数
int exitn(int i,int j,int s,int a[])
{
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值