在一个8×8国际象棋盘上,有8个皇后,每个皇后占一格;要求皇后间不会出现相互“攻击”的现象,即不能有两个皇后处在同一行、同一列或同一对角线上。问共有多少种不同的方法。这是一个古老的问题,解法分很多种,串行,并行,递归,循环,等等不过我认为这道题目的真正难点在于找到一个从坐标到该坐标是否与其queen冲突的映射。剩下的只是实现方法上的不同一个Queen的攻击范围有8个方向,如果不考虑正负向,可认为其攻击方位实在4条直线上,OK-在横向的冲突最容易解决,因为我们解题时一般都是逐行求解,所以不会出现两个Queen在一行上的情况-在纵向上的冲突也容易解决,我们可以声明一个有个8个元素的BYTE数组BYTE col[8]={},如果坐标为(i,j)的位置上有Queen,则执行col[j]=1就可以了,以后直接判断对应列标志位是否为1就可以判端新Queen是否与已有的Queen存在冲突-在正45度和负45度线上的冲突处理就比较复杂了,这里运用一个最简单的几何定理就可以简化问题,几何中直线的定义是y=ax+b;而我们的其余两种冲突相应的可表示为y=x+b1和y=-x+b2;然后根据x[0,7],和y[0,7]的取值区间得出相应b1,b2的取值区间为b1 [-7,7]b2 [0,14]将b1区间平移7也得到了[0,14]这样我们就可以再声明两个数组BYTE a[15],b[15],来唯一标识正45度和负45度线上的冲突了,映射关系为i-j+7 ==>a[15];i+j ==>b[15];一下是我实现的解法
posted on 2009-08-10 15:11 pear_li 阅读(1900) 评论(0) 编辑 收藏 引用 所属分类: C++