顺序栈实现 马踏棋盘

使用顺序栈和贪心算法实现马踏棋盘,选取每个位置8个方向上可行路径最少的方向前进,遇到死胡同则回溯。通过设置权值数组记录每个位置的可行路径数,并进行循环搜索。
摘要由CSDN通过智能技术生成

好久 没写博客了、下面 先总结一下 开学这一个月以来 写的几个数据结构小程序吧、、

小渣渣一枚、只为记录一下自己的学习历程、忘各位大神 海涵。


(一)30个小时、憋出来的——顺序栈实现 马踏棋盘


思路:

用栈来 写马踏棋盘、 也用到了点贪心算法, 都是 选择下一个位置 的8个方向上的可行路径数(方向索引权值)最小的走、因为一开始往可行路径少的点跳,则往后出口多的点就多,能跳通的可能性就大。然后 一但走进死胡同、那么 就得进行回溯。

回溯的思路就是:依次 将所有dir为8的元素弹栈、然后 将 可行路径第二代少的那个点 入栈。

然后 开始 继续循环跑......


好、下面第1步、我们来设置权值(将每一个位置的的可行路径数 放在二维数组weight[M][M]中):

<pre name="code" class="cpp">Position Getnext_Point(Position temp, int dir)
{
	switch (dir)
	{
	case 0: temp.x+=1; temp.y-=2; break;
	case 1: temp.x+=2; temp.y-=1; break;
	case 2: temp.x+=2; temp.y+=1; break;
	case 3: temp.x+=1; temp.y+=2; break;
	case 4: temp.x-=1; temp.y+=2; break;
	case 5: temp.x-=2; temp.y+=1; break;
	c
马踏棋盘 链表 按照老师的要求的。大家来下载吧· 但是计算算法比较冗余,计算不较慢。 #include #include "conio.h" using namespace std; #define edgetype int #define vextype int #define MAX 8 typedef struct node { int vextex;//序号 struct node *next; }edgenode; typedef struct { int vextex; int x,y; edgenode *link; }vexnode; const int px[8]={1,2,2,1,-1,-2,-2,-1}; const int py[8]={2,1,-1,-2,-2,-1,1,2}; const int L=8,H=8; vexnode ga[L*H]; //图 int visited[L*H]={0}; typedef struct /*顺序栈的结构体类型定义*/ { int stack[L*H]; int top; }seqstack; seqstack s; void setnull(seqstack *s) /*置空-由于c语言的数组下标是从0开始的,所以置 空操作时将顶指针放在下标为0之前,即-1处。*/ {s->top=-1;} int empty(seqstack *s) /*判断当前是否为空*/ { if(s->toptop>L*H-1) { printf("stack overflow!\n"); /*发生上溢*/ return 0; } else { s->stack[++s->top] = x; /*顶指针上移,数据元素入*/ return 1; } } int pop(seqstack *s) /*弹出当前s的顶元素*/ { if(s->toptop--; return(s->stack[s->top+1]); }/*由于return语句的特点,必须先使top减1,然后再执行return语句。而此时顶元素的表示应该为s->top+1.*/ } void init() { int n; for (int i=0;i<H;i++) { for (int j=0;j<L;j++) { n=L*i+j; ga[n].vextex=n; ga[n].x=j; ga[n].y=i; ga[n].link=NULL; } } printf("\n"); for (i=0;i<L*H;i++) //列出邻接链表 { edgenode *p; for (int k=0;k<MAX;k++) { int tx=ga[i].x+px[k]; int ty=ga[i].y+py[k]; if(tx<0||ty=L||ty>=H) continue; //出界了 else //采用前插法 { p=(edgenode*)malloc(sizeof(edgenode)); p->vextex=ty*L+tx; p->next=ga[i].link; ga[i].link=p; // printf("%d ",ga[i].link->vextex); } } } for (i=0;i<L*H;i++) { printf("%d ",ga[i].vextex); if (!((i+1)%L)) { printf("\n"); } } } void show() //打印邻接表 { int i; printf("\n"); for (i=0;i",ga[i].vextex); edgenode *p; p=(edgenode*)malloc(sizeof
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值