高三誓言50字左右:关于C语言的题,很有趣的

来源:百度文库 编辑:高考问答 时间:2024/04/28 01:03:45
在n*n的棋盘上放置n个皇后,而使彼此不受攻击,其xi表示皇后i放在棋盘第i行的xi列,且互不相同.(指的是国际象棋).老师已经给出了方法.皇后在斜率为1和-1的直线的格上就会互相攻击,给出两后放置的位置的坐标为(i,j) (k,l)
斜率K=+1的直线上,下标植满足行加列相等,i+j=k+l;
斜率K=-1的直线上,下标值满足行减列相等,i-j=k-l;
稍加整合两式得:
|i-j|, |l-j|的绝对值相等
算法:
求n后问题的一切解n queen(n)

1.[置初值] x(1)←0 k←1
2.求n后的解
循环 当k >0时 执行
<1> x(k)←x(k)+1 第k 后右移一列
<2>循环 当x(k)≤n 且place(k)=false 执行
X(k)←x(k)+1
<3> 若x(k)≤n
则若 k=n
则 print(x)
否则 k←k+1
X(k)←0
否则 k ←k-1
3.算法结束
算法:第n后能否放在x(k)的位置 place(k)
1[置初值]
i←1
2.求n 的位置
<1>循环,当i<k时,执行
a) 若x(i)=x(k),或ABS{x(i)-x(k)}=ABS(i-k)
则 place←false
b) i←i+1
<2>place←true
3.算法结束

读了一下这个程序,感觉这个地方比较不好理解应注释一下,
//下面先把安全位数组完成
i=0;//i 是现在要检查的数组值
while (i<num){
qsave[chess[i]]=false;
int k=num-i;
if ( (chess[i]+k >= 0) && (chess[i]+k < QueenMax) ) qsave[chess[i]+k]=false;
if ( (chess[i]-k >= 0) && (chess[i]-k < QueenMax) ) qsave[chess[i]-k]=false;
i++;
}
这实际是找出第num行所有安全位置。

理解一下好像树的递归遍历啊

你在百度里搜“回溯法”就可以知道答案了。