逃离大厦第80关与马踏棋盘

来源:互联网 发布:古道社区网络黑市 编辑:程序博客网 时间:2024/04/29 18:35

今天我在玩一款逃离大厦的解密游戏。在跨越了重重障碍来到了第八十关。这一关很有意思


题目要求
这里写图片描述
每次点击都会直接冲到底,要求填满所有空白的地方。
本来很容易,但是很不幸,一旦点击了就不能修改,楼主于是想到了马踏棋盘,终于可以学以致用了于是毫不犹豫
上代码

#include <stdio.h>#include <stdlib.h>#define N 5+2typedef 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;}

这里写图片描述

答案


最终经过代码运行终于通过了这一关。

附上楼主的马踏棋盘代码

http://blog.csdn.net/btnode/article/details/42664805

0 0
原创粉丝点击