问题描述:
国际象棋或中国象棋中,在棋盘上,从任意指定的方格出发,为马寻找一条路径使马能走遍棋盘每一格并且每格只经过一次。
分析:
如果是使用深度优先搜索+回溯,时间复杂度高,这里我们需要一种更高效的算法。使用贪心的思想,在每个结点对其子结点进行选取时,优先选择子节点可落子位置最少的结点。可落子位置意思是下一步能走到得位置,如:
马口口口口
口口口口口
口口口口口
口口口口口
它的可落子位置为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[])
{