马踏棋盘算法(骑士周游问题)
定义:将马随机放在国际象棋的8×8棋盘[0~7][0~7]的某个方格中,马按走棋规则进行移动。要求每个方格只进入一次,走遍棋盘上全部64个方格
(可扩展为NxN的棋盘)
鄙人小白,连续数天研究此问题。
也是老师布置的作业,某老师编写的教科书上面的代码思想为:
采用栈的数据结构,即将马的行走顺序压入栈中
具体步骤如下:
1)建立一个栈,定义其栈顶和栈底,以及栈的大小。
2)将马的初始步压入栈中,计算其8个方向的权值,各点的8个方向按权值升序排列。
3)马向最小权值方向行走,得到下一步,重复步骤(2)
4)某步的下一步超出棋盘,则应重新走,这一步出栈,由前一步重新选择方向。
5)最后,根据栈中内容将马的行走路线填入方阵中,输出
其中栈的作用就是保存马的路径,以便走错了之后“回溯”(悔棋)用
一开始并不明白是怎么回事,于是百度
方法一:深搜+回溯
找到了深搜+回溯的方法,思想就是一直在找下一个可以糟蹋的点,糟蹋后再找下一个点,同一个点只能走一次。
自己写代码如下:
主要函数及功能:
1)int NextStep(int *x, int *y , int step)
找下一个可以糟蹋的点,参数为地址值,函数调用后,x,y值已经成为下一个点。
2)int Dfs(int x, int y, int count)
深搜方法不断地往下一个走,直到踏遍所有点。
/*************************************************************************
> File Name: mataqipan.c
> Author:***
> Mail: ***
> Created Time: Fri 09 Oct 2015 02:27:36 PM EDT
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 8
int CHESS[N][N];
int NextStep(int *x, int *y , int step)
{
switch(step)
{
case 0:
{
if(*x + 1 <= N -1 && *y - 2 >=