首先是自己想写一些东西,如果继续拖延就是以后都不会写了,虽然很弱,但是下笔去写,总是会去思考的,然后大家一起进步(笑)。
首先是罗凯布置的那道题:
:
首先看到题目我的第一反应是深搜,试了一下果然可以,这是我的递归的代码(写代码和想的过程没有上网查阅任何资料,如有雷同,我也不知道是什么回事):
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比较简单好看
//但是身边有个哥们直接写了9个if在那里,试起来却比我的快,不知道为什么,求解
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;
}
看一下应该很容易就理解了,就是把自己一次次试的过程代码化:我们人工想就是,我一步步跳,知道跳入了一个封闭的地方,以及没地方可以跳下一步了,所以就回到上一步,来寻找下一个跳的地方。知道找到一个可行的解再输出,应该没错吧,各位。
额,还要去上课,就简单地写这些,有空我看一些回溯的东西,再总结发出来。