• kinght的游荡


    首先是自己想写一些东西,如果继续拖延就是以后都不会写了,虽然很弱,但是下笔去写,总是会去思考的,然后大家一起进步(笑)。

    首先是罗凯布置的那道题:

    首先看到题目我的第一反应是深搜,试了一下果然可以,这是我的递归的代码(写代码和想的过程没有上网查阅任何资料,如有雷同,我也不知道是什么回事):

    const int xChange[8]={-2,-1,1,2,2,1,-1,-2};

    const int yChange[8]={1,2,2,1,-1,-2,-2,-1};

    //这是把那8步抽成对应的数组,下面直接来个for比较简单好看

    //但是身边有个哥们直接写了9if在那里,试起来却比我的快,不知道为什么,求解

    bool slove(int x,int y,int state[8][8],int sequence){

        state[x][y]=sequence;

        if(sequence==64)//这是真正的最终停止的条件,找到解

            return 1;

        for(int i=0,change=0;i<8;++i){

            int x1=x+xChange[i];

            int y1=y+yChange[i];//就是把棋盘看成X-O-Y平面,上面整点

            if(x1>=0&&x1<=7&&0<=y1&&y1<=7&&state[x1][y1]==0)

                if(slove(x1,y1,state,sequence+1))//通过这个if来调用下一个函数

                    change+=1;

            if(i==7&&change==0){//通过Change来判断这点是否有地方可走,

                state[x][y]=0;    //不可以走就是要退回去

                return 0;//通过0的返回来告诉那个IF的地方是不可以的,所以change    //+

            }

        }

        return 1;

    }

    看一下应该很容易就理解了,就是把自己一次次试的过程代码化:我们人工想就是,我一步步跳,知道跳入了一个封闭的地方,以及没地方可以跳下一步了,所以就回到上一步,来寻找下一个跳的地方。知道找到一个可行的解再输出,应该没错吧,各位。

    额,还要去上课,就简单地写这些,有空我看一些回溯的东西,再总结发出来。

  • 相关阅读:
    2015.07-2015.08
    the last lecture
    强化的单例属性_Effective Java
    Socket通信客户端设计(Java)
    静态工场方法代替构造器
    如何控制Java中的线程,总结了3种方法...
    如何快速转型,比如C#...to...Java
    C#中var和dynamic
    How to use the Visual Studio
    mark blog
  • 原文地址:https://www.cnblogs.com/wwxtju/p/4340569.html
Copyright © 2020-2023  润新知