組合數學 36軍官問題

2021-06-22 10:53:07 字數 1387 閱讀 8191

據說普魯士的腓特列大帝曾組成一支儀仗隊,儀仗隊共有36名軍官,來自6支部隊,每支部隊中,上校、中校、少校、上尉、中尉、少尉各一名。他希望這36名軍官排成6×6的方陣,方陣的每一行,每一列的6名軍官來自不同的部隊並且軍銜各不相同。令他惱火的是,無論怎麼絞盡腦汁也排不成。

後來,他去求教瑞士著名的大數學家尤拉。尤拉發現這是乙個不可能完成的任務。

來自n個部隊的n種軍銜的n×n名軍官,如果能排成乙個正方形,每一行,每一列的n名軍官來自不同的部隊並且軍銜各不相同,那麼就稱這個方陣叫正交拉丁方陣。尤拉猜測在

n=2,6,10,14,18,…

時,正交拉丁方陣不存在。然而到了上世紀60年代,人們用計算機造出了n=10的正交拉丁方陣,推翻了尤拉的猜測。現在已經知道,除了n=2,6以外,其餘的正交拉丁方陣都存在,而且有多種構造的方法

為了解決上面的排列組合問題,我們可以建立數學模型,將上述問題轉化為:能不能把36個有序對(i,j)(i=1,2,……6;j=

1,2,……6

)排列成乙個6×6的矩陣,使得該矩陣的每一行每一列上整數

1,2,……6能夠以某種順序出現?(覺得和數獨是不是有點類似,但是有附加條件)

我們可以將這樣的矩陣分割為兩個

6×6的矩陣,乙個對應於有序對的第乙個位置(軍銜矩陣),另乙個對應有序對的另乙個位置(軍團矩陣)。這樣問題可以描述如下:

1)這兩個矩陣

的每一行每一列上整數

1,2,……6能夠以某種順序出現

2)當並置這兩個矩陣時,所有有序對(i,j)

(i=1,2,……6;j=

1,2,……6

)全部出現

上面矩陣比較大,我們以來自3個軍團3個級別軍銜的9個軍官為例,可以得到問題的解(可以筆算得到)如下:

從上圖可以看出,軍銜矩陣和軍團矩陣都是3階拉丁方陣,並且兩者並置得到的並置矩陣得到了所有可能的9個有序對(i,j)。這種情況下,我們稱軍銜矩陣和軍團矩陣是正交的,並置矩陣稱為正交拉丁方陣。

很明顯,3階正交拉丁方陣是存在的,對於36軍官問題,也就是要求證6階正交拉丁**是否存在。前面已經提到,

除了階數n=2,6以外,其餘的正交拉丁方陣都存在,而且有多種構造的方法

對於正交拉丁方陣的構造,由於比較複雜,有時間再研究,下面給出拉丁方陣的具體實現:

#includeusing namespace std;

void main()

{ int n,i,j,count;

int num[20];//這裡可以輸入的階數n的最大值是,可以自己修改

cout<

cin>>n;

for(i=0;i原文:

組合數學問題

監獄有連續編號為1.n的n個房間,每個房間關押乙個犯人,有m種宗教,每個犯人可能信仰其中一種。如果相鄰房間的犯人的宗教相同,就可能發生越獄,求有多少種狀態可能發生越獄 輸入兩個整數m,n.1 m 10 8,1 n 10 12 可能越獄的狀態數,模100003取餘 6種狀態為 000 001 011 ...

組合數學 購票問題

購票問題 題目大意 一張票50元,有n個帶著50元的人和n個帶著100元的人,請問總共有多少種排隊方法使得不會出現購票找不回錢的尷尬局面?輸入樣例 2 輸出樣例 2 這是一類非常有代表性的問題,下面將介紹該問題的5種解法 number 5 暴力列舉 很顯然,要使帶著100元的購票那麼就需要50的去找...

組合數學 求組合數

對於求組合數,要根據所給資料範圍來選擇合適的演算法 這道題中所給的資料範圍適合用打表的方法直接暴力求解 先用4e6的複雜度預處理出所有的情況,再用1e4的複雜度完成詢問即可 include using namespace std const int n 2010 const int mod 1e9 ...