关于简单的马的遍历

关于简单的马的遍历(4*4)

这是我进入实验室以来学长第一次布置的任务,当然,我刚刚开始学栈和队列,然后略懂之后学长就给我布置的任务;

要求,在4*4的棋盘里输入马的坐标,利用相关知识让马只能以走日的方式踩遍棋盘每个点,最终输出马走每个点的步数(第几步走到这个点)。

这个看似很简单,但是对刚接触栈的我,还是有点难理解,最终思路如下;

1,建栈(附加栈的一系列操作)

2,定马(确定马的点,就是输入马的初始点),让其入栈;

3,判断马下一步(如果可以走,那么入栈,不能走则弹栈);

4,循环,马会走十六步,所以一定会走完各个点,当cnt(计数)<=16时循环;

代码如下:

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
typedef struct chess {
	int x[100];//存放坐标x
	int y[100];//存放坐标y
	int top;
} Chess;
//建栈
Chess * creative() {
	Chess * p;
	p=(Chess*)malloc(sizeof(Chess));
	p->top=-1;
}
//入栈
void push(Chess* p,int x,int y) {
	if(p->top==99) {
		printf("栈满");
		return ;
	}
	p->top++;
	p->x[p->top]=x;
	p->y[p->top]=y;
}
//出栈
void pop(Chess *p,int *x,int *y) {
	if(p->top==-1) {
		printf("栈空\n");
		return;
	}
	*x=p->x[p->top];
	*y=p->y[p->top];
	p->top--;
}//取栈顶
void Top(Chess*p,int *x,int *y) {
	if(p->top==-1) {
		return ;
	}
	*x=p->x[p->top];
	*y=p->y[p->top];
}//判断栈空
int Bool(Chess *p) {
	return (p->top==-1);
}
//int BJ(Chess *p,int x,int y) {
//	int a,b;
//	pop(p,&a,&b);
//	if(a==x&&b==y) {
//		return 0;
//	}
//	return 1;
//}
int Next(int *a,int *b,int c[][4]);//判断马下一步能不能跳
int  main() {
	int cnt=1;
	Chess *p;
	p=creative();
	int a[4][4]= {0};
	for(int i=0; i<4; i++) {
		for(int j=0; j<4; j++) {
			a[i][j]=0;
		}
	}
	int x,y;
	scanf("%d %d",&x,&y);
	//int i=x,j=y;
	push(p,x,y);//入栈
	a[x][y]=cnt;
	cnt++;
	while(cnt<17) {//此处<17的效果与<=16相同
		if(Next(&x,&y,a)==1) {
			push(p,x,y);
			a[x][y]=cnt;
			cnt++;
		} else {
			pop(p,&x,&y);//判断为非,弹栈;
		}
	}

	for(i=0; i<4; i++) {
		for(j=0; j<4; j++) {
			printf("%10d",a[i][j]);
		}
		printf("\n");
	}
	return 0;
}

int Next(int *a,int *b,int c[][4]) {
	if(*a-2>=0&&*b+1<4&&c[*a-2][*b+1]==0) {
		*a-=2;
		*b+=1;
		return 1;
	} else if(*a-1>=0&&*b+2<4&&c[*a-1][*b+2]==0) {
		*a-=1;
		*b+=2;
		return 1;
	} else if(*a+2<4&&*b+1<4&&c[*a+2][*b+1]==0) {
		*a+=2;
		*b+=1;
		return 1;
	} else if(*a+1<4&&*b+2<4&&c[*a+1][*b+2]==0) {
		*a+=1;
		*b+=2;
		return 1;
	} else if(*a-2>=0&&*b-1>=0&&c[*a-2][*b-1]==0) {
		*a-=2;
		*b-=1;
		return 1;
	} else if(*a-1>=0&&*b-2>=0&&c[*a-1][*b-2]==0) {
		*a-=1;
		*b-=2;
		return 1;
	} else if(*a+1<4&&*b-2>=0&&c[*a+1][*b-2]==0) {
		*a+=1;
		*b-=2;
		return 1;
	} else if(*a+2<4&&*b-1>=0&&c[*a+2][*b-1]==0) {
		*a+=2;
		*b-=1;
		return 1;
	}
	return 0;
}

该代码借鉴了博客peter_linky大佬的代码;

而且有兴趣的大佬可以了解一下马踏棋盘这个问题,一条路走到黑,于这种不同的在于,马踏棋盘要求每一步都连贯;这种只是马无论以何种方式反正踩完棋盘就行;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值