在一個(gè)8×8國(guó)際象棋盤(pán)上,有8個(gè)皇后,每個(gè)皇后占一格;要求皇后間不會(huì)出現(xiàn)相互“攻擊”的現(xiàn)象,即不能有兩個(gè)皇后處在同一行、同一列或同一對(duì)角線(xiàn)上。問(wèn)共有多少種不同的方法。這是一個(gè)古老的問(wèn)題,解法分很多種,串行,并行,遞歸,循環(huán),等等不過(guò)我認(rèn)為這道題目的真正難點(diǎn)在于找到一個(gè)從坐標(biāo)到該坐標(biāo)是否與其queen沖突的映射。剩下的只是實(shí)現(xiàn)方法上的不同一個(gè)Queen的攻擊范圍有8個(gè)方向,如果不考慮正負(fù)向,可認(rèn)為其攻擊方位實(shí)在4條直線(xiàn)上,OK-在橫向的沖突最容易解決,因?yàn)槲覀兘忸}時(shí)一般都是逐行求解,所以不會(huì)出現(xiàn)兩個(gè)Queen在一行上的情況-在縱向上的沖突也容易解決,我們可以聲明一個(gè)有個(gè)8個(gè)元素的BYTE數(shù)組BYTE col[8]={},如果坐標(biāo)為(i,j)的位置上有Queen,則執(zhí)行col[j]=1就可以了,以后直接判斷對(duì)應(yīng)列標(biāo)志位是否為1就可以判端新Queen是否與已有的Queen存在沖突-在正45度和負(fù)45度線(xiàn)上的沖突處理就比較復(fù)雜了,這里運(yùn)用一個(gè)最簡(jiǎn)單的幾何定理就可以簡(jiǎn)化問(wèn)題,幾何中直線(xiàn)的定義是y=ax+b;而我們的其余兩種沖突相應(yīng)的可表示為y=x+b1和y=-x+b2;然后根據(jù)x[0,7],和y[0,7]的取值區(qū)間得出相應(yīng)b1,b2的取值區(qū)間為b1 [-7,7]b2 [0,14]將b1區(qū)間平移7也得到了[0,14]這樣我們就可以再聲明兩個(gè)數(shù)組BYTE a[15],b[15],來(lái)唯一標(biāo)識(shí)正45度和負(fù)45度線(xiàn)上的沖突了,映射關(guān)系為i-j+7 ==>a[15];i+j ==>b[15];一下是我實(shí)現(xiàn)的解法
posted on 2009-08-10 15:11 pear_li 閱讀(1926) 評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi): C++