窮舉法典例

2021-08-10 22:19:56 字數 2000 閱讀 2255



一、八皇后問題

問題描述:八皇后問題是乙個以西洋棋為背景的問題:如何能夠在 8×8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行、縱行或斜線上,請找出有多少種。2方法

1、演算法分析:

(1)我們通過定義八個變數八重迴圈來模擬棋盤存放八皇后的合適位置,每個變數表示一行裡存放皇后的合適列的位置,所以這個變數可以在棋盤的這個行上移動,長度範圍限制為8,因為棋盤是8列的,也因為,我們每行就定義了乙個變數代表乙個皇后,所以行裡面不存在同時有兩個皇后的問題。

(2)其次,每列不能有兩個皇后,豎線上不重複的情況相對簡單,相信大家都能想到,假如我們設定兩個座標為(i,j)和(k,s),(i,j)代表在前面行的座標,(k,s)代表在下面列的座標,那麼不在同一豎線上,可以表示為i!=k;

(3)在斜線上的話有四個方向,但是由於我們是從上往下擺放皇后的,所以每次擺放這行的皇后時,下一行還沒有東西,所以只需要考慮上面兩個斜線的方向,很形象的就是「公尺」字的上半部分的。大家可以想象一下二維座標,(0,0)和(1,1)是不是在45度斜線上,(2,2)和(4,4,)是不是在同乙個斜線上,這就是說明說明,如果兩個座標的橫座標的差等於縱座標的差就是在同一斜線上,也就是i-k=j-s或者是k-i=s-j;這個是不是可以合併一下用絕對值表示,abs(i-k)=abs(s-k);

2、**實現

//窮舉法

#include

#include

//i1--i8儲存每一行每個皇后可以擺放的列數

//判斷條件i#==i#和abs(i#-i#)==#就是模擬的同一列和兩個斜線的情況

void queen()

for(int i3=1;i3<=8;i3++)

for(int i4=1;i4<=8;i4++)

for(int i5=1;i5<=8;i5++)

for(int i6=1;i6<=8;i6++)

for(int i7=1;i7<=8;i7++)

for(int i8=1;i8<=8;i8++)

count++;

printf("1:%d,2:%d,3:%d,4:%d,5:%d,6:%d,7:%d,8:%d,%d\n",i1,i2,i3,i4,i5,i6,i7,i8,count); }

} }} }

} }}

int main()

二、找零問題

問題描述:有人要找零,如果15分,23分,29分,41分,67分都有足夠多,則湊成1808分有多少種情況

演算法分析:

1、因為有五種零錢,所以我們定義五個變數模擬每種零錢找的數目;

2、每個零錢最少可以找0個,肯定不可能是負數,所以每個變數最少是從零開始,但是要湊齊乙個找零數,也許都用一種錢幣就可以完成找零,所以每種零錢個數的上限是需要找的總的1080的數目除以它的面值,只需要取整就行,因為如果有餘數說明光憑這個幣值完成不了找零,加一會多,無意義;

3、遍歷所有情況時,我們可以做一些排除,比如如果當前的面值加起來已經大於1080了,那就不需要往下遍歷了,因為肯定不符合,所以我們可以用continue結束本次迴圈,繼續下次的。

**實現:

int money()

for(int m3=0;m3<=1808/29;m3++)

for(int m4=0;m4<=1808/41;m4++)

for(int m5=0;m5<=1808/67;m5++)

} }

} }

} return count; }

三、對手匹配

問題描述:有兩個桌球隊,乙個隊有成員a,b,c,乙個隊有隊員x,y,z,a不和x打,c不和x,z打,找出三對賽手名單。

演算法分析

這個題目的實現很簡單只需要三重迴圈,把第一隊的每個隊員都和二隊的隊友遍歷一遍,把不符合條件的情況剔除就行了。

**實現:

int main() */

窮舉法 列舉法

列舉法,常常稱之為窮舉法,是指從可能的集合中一一枚舉各個元素,用題目給定的約束條件判定哪些是無用的,哪些是有用的。能使命題成立者,即為問題的解。採用列舉演算法解題的基本思路 1 確定列舉物件 列舉範圍和判定條件 2 一一枚舉可能的解,驗證是否是問題的解 下面我們就從列舉演算法的的優化 列舉物件的選擇...

C語言窮舉法

使用c語言窮舉法解決求總值問題。1 乙隻猴子採摘了一堆蘋果,第一天吃一半的蘋果,猴子覺得還不夠,於是再吃了乙個。第二天也是這樣。一直到吃了九天,第十天就只剩下乙個了。請問猴子一共採摘了多少蘋果。分析 解決此類問題有兩個方法。一種就是我們較為容易想到的逆推法。還有一種就是窮舉法。逆推法 include...

Java窮舉法例子

一 甲 乙 丙 三位球迷分別 進入半決賽的四隊a b c d的名次如下 甲 a 第一名 b 第二名 乙 c 第一名 d 第三名 丙 d第一名 a 第三名 設比賽結果,四隊互不相同,並且甲乙丙的 各對一半,求a b c d隊的名次?採用窮舉法令變數a,b,c,d分別為四個名次 方法一 前者正確,則後者...