关于简单的马的遍历(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大佬的代码;
而且有兴趣的大佬可以了解一下马踏棋盘这个问题,一条路走到黑,于这种不同的在于,马踏棋盘要求每一步都连贯;这种只是马无论以何种方式反正踩完棋盘就行;