據說普魯士的腓特列大帝曾組成一支儀仗隊,儀仗隊共有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 ...