今天我在玩一款逃离大厦的解密游戏。在跨越了重重障碍来到了第八十关。这一关很有意思
每次点击都会直接冲到底,要求填满所有空白的地方。
本来很容易,但是很不幸,一旦点击了就不能修改,楼主于是想到了马踏棋盘,终于可以学以致用了于是毫不犹豫
上代码
#include <stdio.h> #include <stdlib.h> #define N 5+2 typedef struct { int a[N][N]; int lstep[4]; int rstep[4]; int cnt; }Horse; void Init(Horse *p) { int i,j; for(i=0;i<N;i++){ for(j=0;j<N;j++){ p->a[i][j]=-1; } } for(i=1;i<N-1;i++){ for(j=1;j<N-1;j++){ p->a[i][j]=0; } } p->cnt=0; p->a[1][1]=p->a[2][3]=p->a[3][5]=p->a[5][4]=-1; p->lstep[0]=p->rstep[3]=-1; p->lstep[1]=p->lstep[3]=p->rstep[0]=p->rstep[2]=0; p->lstep[2]=p->rstep[1]=1; } void prin(Horse *p) { int i,j; for(i=0;i<N;i++){ for(j=0;j<N;j++){ printf("%3d",p->a[i][j]); } putchar('\n'); } } /* 一共有21个空 使用回溯思想 从(1,1)--(5,5); 每次转变方向必须冲到底 */ void function(int R,int C,Horse *p) { int i;//控制方向 int save; for(i=0;i<4;i++){ if(p->a[R+p->lstep[i]][C+p->rstep[i]]==0){ //冲到底 save=p->cnt; while(p->a[R+p->lstep[i]][C+p->rstep[i]]==0){ R=R+p->lstep[i]; C=C+p->rstep[i]; p->a[R][C]=++(p->cnt); } if(p->cnt<21){ function(R,C,p); }else{ prin(p); } //按照原方向退到低 do{ p->a[R][C]=0; p->cnt--; R=R-p->lstep[i]; C=C-p->rstep[i]; }while(save!=p->cnt); } } } int main(void) { Horse p; Init(&p); prin(&p); int i,j; int time=0; for(i=1;i<N-1;i++){ for(j=1;j<N-1;j++){ function(i,j,&p); printf("time=%d\n",time++); } } return 0; }
最终经过代码运行终于通过了这一关。
附上楼主的马踏棋盘代码