今天做八皇后问题,起初是自己想的一个算法,觉得是自己想出来的才能够在以后的做题应种中更加的熟练,所以我是选择了自己写。可能是由于我对于递归的不熟练,和理解的不深刻,结果写的那个算法不好,我的return太多了,而且整个的思路感觉是混乱的,逻辑不清晰。就是没有真的明白递归的含义,递归的发生,就感觉是再用函数似的,可结果却不知道怎么返回,往哪里返回,返回了该怎么用,或者说下一步该怎么走。
void queen(int a[],int y,int x)
{
if(y>p){
int i=1;
while(i<p){
printf("%d",a[i]);
i++;
}
return ;
}
if(x<=p&&index(a,y,x)){
a[y]=x;
// if(queen(a,y+1,1)){
queen(a,y+1,1);
// }
}
else {
if(x<=p)
queen(a,y,x+1);
else
queen(a,y-1,a[y-1]+1);
}
}
这是我的一个求queen的一个函数,可以看一下,其实我的思维是比较混乱的,而且觉得有点纠缠不清的感觉,到最后就成了硬凑的感觉了。迷迷糊糊的,感觉就像不经过思考了,不动脑子了。
//===========================
void eight_queen(int index)
{
int loop;
for(loop = 0; loop < 4; loop++){
if(check_pos_valid(index, loop)){
gEightQueen[index] = loop;
if(3 == index){
gCount ++, print();
gEightQueen[index] = 0;
return;
}
eight_queen(index + 1);
gEightQueen[index] = 0;
}
}
}
//==========================
void queen(int k,int n) //放置1~k的皇后
{ int j;
if (k>n)
print(n); //所有皇后放置结束
else
for (j=1;j<=n;j++) //在第k行上穷举每一个位置
if (place(k,j)) //在第k行上找到一个合适位置(k,j)
{ q[k]=j;
queen(k+1,n);
}
}
//===============================
以上是两个我觉得比较好的代码,就是思路很清晰,代码不是冗长的,而且处处都能看的出是经过思考的。
我觉得这是两种截然不同的递归思路,第一种不如第二种好理解,但是第一种真的动脑子了,我觉得,所以我很喜欢。
还有我觉得好的经典的代码也是需要熟练记忆的,它就像宝藏一样,需要不断的记忆,熟练掌握,然后从中慢慢的抽丝剥茧,有利于以后的创新,当面对新的问题的时候,可以先不慌,可以结合自己的经验,创造出适合这个问题的新的解决问题的方式。