zoukankan      html  css  js  c++  java
  • 逃离大厦第80关与马踏棋盘


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


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

    #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('
    ');
        }
    }
    /*
       一共有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
    ",time++);
        }
        }
        return 0;
    }

    这里写图片描述

    答案


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

    附上楼主的马踏棋盘代码

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

  • 相关阅读:
    【python】正则表达式
    Java 接口、抽象类
    设计模式之抽象工厂方法模式
    设计模式之工厂方法模式
    设计模式之单例模式
    pulltorefresh学习
    ProgressDialog使用
    android:descendantFocusability用法简析
    数据保存之File
    runOnUiThread学习
  • 原文地址:https://www.cnblogs.com/pzqu/p/9457642.html
Copyright © 2011-2022 走看看