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

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

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

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;

}

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

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

posted on 2014-04-13 18:48  王小惟  阅读(195)  评论(0编辑  收藏  举报