马踏棋盘及其优化

本文介绍了马踏棋盘问题,通过深度优先搜索解决,并探讨如何利用栈避免递归,提出通过优化试探顺序减少回溯次数以提高效率。在最坏情况下,通过优先试探可达点更少的点,可以有效减少回溯,从而提升算法性能。
摘要由CSDN通过智能技术生成

马踏棋盘及其优化

问题描述:

在8*8的国际象棋棋盘中的任何一个位置,放置一个马(棋子),使其按照马在国际象棋中的规则(走日)进行移动,求其中的一个解。

问题分析:

这其实是一个深度优先搜索的问题,深度优先搜索一般使用递归实现,在这里,为了学习,使用我们更不熟悉的栈来操作。

算法:

1.给定一个起点,将起点入栈,步数step=1。
2.在map数组中的该位置的值赋为step;step++; 
3.
根据上图,按照0~7的顺序试探下一个点:令direction=0,若下一个点位置合法,则下一个点入栈,再执行第3步;若下一个点位置不合法,试探下一个方向,即direction++。 4.若试探第7个方向direction==7,下一个点仍然不合法,则该点出栈,将栈顶的direction++,且将当前位置设置为栈顶的位置。 5.重复第3,4,直到步数step=64(棋盘已经被填满)或者,栈为空(没有解)(当然,一定会存在解)

代码:

#include <stdio.h>
#include <stdlib.h>

#define SIZE 8

typedef struct{

    int x;
    int y;
    int direction;
}Point;

typedef struct Node{

    Point data;
    struct Node *next;
}PathNode;

typedef struct{

    PathNode *top;
}Stack_Path;

int minindex(int p[]);//求一个数组的最小值的下标 
Stack_Path *Init_Stack(void);//初始化一个栈
void push(Stack_Path *s,Point p);//入栈
void pop(Stack_Path *s,Point *p);//出栈
int IsEmpty(Stack_Path *s);//判空
int IsQualified(Point p);//判断某一个点是否合法
void Go(int x,int y);//输入起点 
void Print();//输出路径
Point Gettop(Stack_Path *s);//获得栈顶元素 
Point NextPos(Point curpos);//生成下一个点

int map[SIZE][SIZE];//记录map[x][y]是第几步 

int main(void){

    printf("请输入起点:\n");
    int x,y;
    scanf("%d%d",&x,&y);
    Go(x,y);
    Print();
};


Stack_Path *Init_St
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值