马踏棋盘及其优化
问题描述:
在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