關於藍橋杯15屆校賽第五題 八皇后問題

2021-07-07 07:55:53 字數 2698 閱讀 2008

昨天比較忙,所以部落格只能推遲到今天凌晨寫了,無奈,主要是想總結一下自己做這道題後的一些見解和一些疑惑。

八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾於2023年提出:在8×8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。 高斯認為有76種方案。2023年在柏林的象棋雜誌上不同的作者發表了40種不同的解,後來有人用圖論的方法解出92種結果。計算機發明後,有多種計算機語言可以解決此問題。用c寫出有多少種擺法。

看到這道題,我第一想法是用冒泡的方法,得到一串八個資料,讓每兩個資料之間符合一定的關係即可,但是仔細一想,如果這樣子做,一效率太低,二條件過於繁瑣,所以就放棄了,轉而想到乙個方法,就是利用二維陣列。給每個格仔初始定義為0,然後將放皇后的定義為1,將每一行每一列每一對角線都分別相加,結果均為1的方案提取出來使擺法加一,最後得出正確擺法數。然而這樣子做在加的過程會極其複雜,所以再一次改進了自己的方針。最後的方針是在第二種想法的基礎上加以改進,首先依然是定義乙個二維陣列,然後全賦予初始值0,即沒有皇后,為假,然後定義乙個遞迴函式,在遞迴函式內定義三個陣列a[8],b[15],c[15]分別表示每一豎皇后剩餘數,從↗️到↙️對角線皇后剩餘數,從↖️到↘️對角線皇后剩餘數,初始均為1,

固定以行為基礎去遞迴,當符合a[col]&&b[n+col]&&c[n-col+7],即各項均為1時,為真,則放好乙個皇后queen[n][col],與其相關的a[col],b[n+col],c[n-col+7]都被賦值為0(col為行數),為後續的判定提供判斷,當遞迴到第八行時,符合每次遞迴的條件的情況使擺法加一,如果不到第八行則持續遞迴,並在每一次迴圈結束後都要取消皇后位置,即恢復初始棋盤賦值,保證後面的迴圈的功能性。每次遞迴引數n加一,由此方案**如下:

#include

int chess[8][8]=;//定義二維陣列代表8x8棋盤

int a[8],b[15],c[15];//定義a[8]代表一豎是八行,定義b[15],c[15]代表從↗️到↙️對角線和從↖️到↘️對角線

intsum=0;//定義sum累計確定一共有多少種結果

void queen(int n)//定義放置皇后的函式

else

//執行,遞迴

chess[n][col]=0;//取消皇后,恢復棋盤初始值

b[n+col]=1;//恢復初始值,保證下一次迴圈的功能性

c[n-col+7]=1;//恢復初始值,保證下一次迴圈的功能性

a[col]=1;//恢復初始值,保證下一次迴圈的功能性}}

}int main()//主函式

for(i=0;i<15;i++)//使b[i]=1,c[i]=1,使初始值都為1,即真

queen(0);//呼叫遞迴函式queen,實現sum的累加

printf("%d\n",sum);//輸出sum的值

return

0;//返回0

}

經驗證,**在mac系統xcode編譯器下輸出結果為92,正確,故基本**無誤。然而關於這段**我依然存在乙個小問題無法通曉,即在主函式中為何不能將其中的兩個迴圈賦值函式改為在定義函式時直接賦值的方式,經過多次更改,均無法無誤編譯,故幾番思索,卻依然無法明了,希望這個問題可以趁早解決,得到我想要的答案,問題截圖如下。

總結已畢,最後,想起從前看到的乙個故事,感觸很深。

每年,澳大利亞都會舉行一場雪梨至墨爾本的耐力長跑,全程875公里,被認為是世界上賽程最長、最嚴酷的超級馬拉松。這項漫長、嚴酷的賽跑耗時五天,參賽者通常都是受過特殊訓練的世界級選手。這些選手大多不到三十歲,有「耐克」等知名運動品牌做後盾,全副武裝著最昂貴的贊助訓練裝備和跑鞋。2023年,耐力長跑賽場上,出現了乙個名叫克里夫·楊的傢伙。起初,誰也沒在意他,大家都以為他是去那兒看比賽的。畢竟,克里夫·楊已經61歲了,穿著條工裝褲,跑鞋外面套了雙橡膠靴。當克里夫·楊上前領取他的運動員號碼時,人們這才明白原來他是來參賽的。他將躋身150名世界級選手的行列參加賽跑!這些選手壓根兒沒想到,還有一件令人稱奇的事,克里夫惟一的教練竟是他81歲高齡的母親耐威爾·冉。2023年他以61歲的高齡5天15時4分的成績跑完了這場長達875公里的雪梨至墨爾本馬拉松比賽,成功地擊敗了世界上最優秀的長跑運動員,捧走了冠軍獎盃,以提前9小時的成績打破了記錄,成了國家英雄!2023年,76歲的克里夫·楊再露頭角,力圖成為年齡最大的環澳長跑選手,為無家可歸的兒童募集資金。整個賽程16000公里,他跑完了6520公里,後來因母親生病而被迫退出了比賽。他對長跑的熱愛從未消減,2023年,他在一項1600公里比賽中跑完了921公里,一星期後在他蓋裡布蘭德的家中病倒,從此再也沒有力氣跑了。輕度中風結束了他英雄般的長跑生涯。

其實,學習也如同一場馬拉松,一場生命的馬拉松,只要堅持,你就可以斡旋而歸,生命不息,戰鬥不止!奮鬥吧,逐夢者……

致追夢的我

2015.11.20 1:55

關於藍橋杯15屆校賽第四題

最近幾天忙著看指標和陣列的關係,把書翻了起來,不翻不要緊,一翻嚇一跳,本以為網上資源那麼豐富,不需要去翻書本,然而並不是這樣,網上講的很片面,書上的細節很多,需要靜下心來去慢慢啃。前幾天校園網故障,一直上不去網,於是也就無法寫部落格了,昨天來網了,而昨天又是藍橋杯校賽,於是就耽擱了寫部落格,最主要也...

藍橋杯第五屆省賽C C A組第五題 錦標賽

如果要在n個資料中挑選出第一大和第二大的資料 要求輸出資料所在位置和值 使用什麼方法比較的次數最少?我們可以從體育錦標賽中受到啟發。如圖 1.png 所示,8個選手的錦標賽,先兩兩捉對比拼,淘汰一半。優勝者再兩兩比拼 直到決出第一名。第一名輸出後,只要對黃色標示的位置重新比賽即可。下面的 實現了這個...

c語言第八屆藍橋杯(第五題)

求1個整數的第k位數字有很多種方法。以下的方法就是一種。include 資料應該為5 求x用10進製表示時的數字長度 int len int x 取x的第k位數字 int f int x,int k int main 我自己的思路 看到題之後 大概瀏覽了一下 還是很簡單的 肯定缺失的部分是遞迴出口 ...