本人最近在网上看到这个问题:
在8×8格的国际象棋盘上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
要求用递归法实现.
在网上也找到一些算法,但是有些问题看不懂,网上的思路是:数组a、b、c分别用来标记冲突,a数组代表列冲突,从a[0]~a[7]代表第0列到第7列。如果某列上已经有皇后,则为1,否则为0。
数组b代表主对角线冲突,为b[i-j+7],即从b[0]~b[14]。如果某条主对角线上已经有皇后,则为1,否则为0。
数组c代表从对角线冲突,为c[i+j],即从c[0]~c[14]。如果某条从对角线上已经有皇后,则为1,否则为0。
数组a我能看懂,但是b和c为什么要设成15个元素却看不明白,希望高手指点一下   谢谢~~~~~~~~

解决方案 »

  1.   

    顺便推导一下i-j+7这个编号是如何来的先来看一个正常的坐标轴
    |       7(y)-7      0       7(x)|       -7
    这里面,如果要表示经过(0,-7),倾斜角为145度的直线,写成方程就是y=-x-7,换句话说,只要某个点满足x+y=-7的时候,这个点就在这条直线上。如果要把这条直线表示为0号线,那么就是x+y+7=0(编号),你同样可以推出,1号线只要满足x+y+7=1,2号线满足x+y+7=2……现在来看看象棋的棋盘编号
    0          7(i)7(j)
    很明显的,你会发现这里i=x,j=-y,所以,通过坐标系的变化,我们得出了,0号线满足
    x-(-y)+7=0,1号线满足x-(-y)+7=1,2号线满足x-(-y)+7=2……,代入i和j,得出0号线满足
    i-j+7=0,1号线满足i-j+7=1,2号线满足i-j+7=2……将这个线的编号纳入数组,就表示数组0到14的元素。