回复 10楼 BlueGuy
重载等C++概念我还不懂,不过2楼的很多方面我并不赞同。
----现在人写代码喜欢人工加密----
2楼的那段代码没注释,读起来确实是很痛苦的,即使有注释也并不好读懂。如果是我的话,我不知道要怎样给它加注释,感觉加了也是白加,还有可能让别人读代码产生误解。
下面我粗略的来解释下那段代码,很多地方我肯定不能表达得很清楚的,请大家见谅。
2楼的思想核心部分就2个地方:int ok(int k)函数和f函数中的那个while循环。那个ok函数很简单,它的功能只是判断加入第k个数以后是不是符合要求(本题目的要求是:是不是还能满足每行每列还有斜行只有一个皇后。)(如果要用来处理全排列的话只要判断k和前面的数是不是重复了)。下面重点解释一下那个while循环。
// 源代码中的chess[s][x[s]]=1 ,其中的s是表示的棋盘的行,x[s]表示的列
//chess[s][x[s]]=1这一句的意思就是在棋盘的第s行,第x[s]列方一颗棋子(皇后)
// 源代码用循环语句和if语句来找到每一行对应的能满足要求的列,当找到8个符合要求的项目的时候就打印出来
//然后又再重新找下一组能满足要求的数据。
while (k > 0)
{
if (k > N)//k如果大于N,那么就执行需要的功能了。这里的k表示当前有k个项目符合要求了。此题目中是只要有8个皇后符合要求,所以当k为9的时候,也就是说已经有8个皇后符合要求了。
{
v++;
for (j = 1; j <=N; j++) printf("%d ", x[j]);
printf("\n");
for(s=1;s<=N;s++)
chess[s][x[s]]=1;
print();
clrchess();
printf("\n");
x[--k]++;//这句以前,k等于N+1;执行以后,k又退回到N,并且让x[N]对应的值加1。本来x[N]是符合要求的,加了1以后,一般情况都是不符合要求的
}
//下面几个else语句是最重要的地方,要解释清楚太麻烦了,要自己去体会
else if (x[k] > N) x[--k]++;//如果x[k]超出了范围,则让x[k-1]这个项目的值加1;
else if (ok(k)) x[++k] = 1;
else x[k]++;
}
最后三句不好解释,要自己去理解。
碰到这样的代码,应该一步一步的去想它的执行过程。我当初是从k的初值1开始推起的。当k为1的时候,while循环里面是执行的if的那个分支;然后k变成了2,又是执行的那个分支;这样下去,一直执行if (k > N)这一分支,那时候我想思路应该就清楚了;再接着k又退回到8,然后是7。。。等理解了这整段代码以后,就会发现这里面的技巧非常的巧妙,
[
本帖最后由 Windy0Winll 于 2010-9-22 19:43 编辑 ]