【组合数学】36军官问题

问题描述:

据说普鲁士的腓特列大帝曾组成一支仪仗队,仪仗队共有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以外,其余的正交拉丁方阵都存在,而且有多种构造的方法

对于正交拉丁方阵的构造,由于比较复杂,有时间再研究,下面给出拉丁方阵的具体实现:

#include<iostream>
using namespace std;
void main()
{
 int n,i,j,count;
 int Num[20];//这里可以输入的阶数n的最大值是,可以自己修改
 cout<<"请输入方阵阶数:";
 cin>>n;
 for(i=0;i<n;i++)      //给数组赋初始值
 {
    Num[i]=i+1;
 }
 for (i = 0;i < n;i++)     //外循环输出n行
 {
  for (j = i,count=1;count<= n;count++)     //内循环输出一行的每个数字
  {
   cout<<Num[j%n]<<'\t';
    j++;
  }
  printf("\n");
 }
}

【组合数学】36军官问题

时间: 2024-11-03 21:44:38

【组合数学】36军官问题的相关文章

HihoCoder1639 : 图书馆([Offer收割]编程练习赛36)(组合数学)

描述 东方图书馆中有n种书,其中第i(1<=i<=n)种有a[i]本,同一种的两本书我们认为是相同的. 东方图书馆将要搬家,现在需要把所有书排成一列.问有多少种排列. 东方图书馆并不关心具体的方案数,他们只想知道方案数的末位数字是多少. 输入 第一行组数t 接下来t组数据 对于每组的第一行一个整数n,表示有多少种图书. 接下来一行,n个数字,表示每种书的本数a[i]. 对于30%的数据1 <= n <= 10, 1 <= a[i] <= 10 对于70%的数据1 <

【BZOJ2227】【ZJOI2011】看电影 [组合数学][质因数分解]

看电影 Time Limit: 10 Sec  Memory Limit: 259 MB[Submit][Status][Discuss] Description 到了难得的假期,小白班上组织大家去看电影.但由于假期里看电影的人太多,很难做到让全班看上同一场电影,最后大家在一个偏僻的小胡同里找到了一家电影院.但这家电影院分配座位的方式很特殊,具体方式如下: 1. 电影院的座位共有K个,并被标号为1…K,每个人买完票后会被随机指定一个座位,具体来说是从1…K中等可能的随机选取一个正整数,设其为L.

HDU - 4810 Wall Painting(组合数学)

Description Ms.Fang loves painting very much. She paints GFW(Great Funny Wall) every day. Every day before painting, she produces a wonderful color of pigments by mixing water and some bags of pigments. On the K-th day, she will select K specific bag

hdu 4810 Wall Painting (组合数学+二进制)

题目链接 下午比赛的时候没有想出来,其实就是int型的数分为30个位,然后按照位来排列枚举. 题意:求n个数里面,取i个数异或的所有组合的和,i取1~n 分析: 将n个数拆成30位2进制,由于每个二进制位异或后相加和原来的数异或相加是一样的,所以只需要对每一位累加计算,用组合数学取数就行了,奇数个异或得1,偶数个异或得0,再乘以自己的二进制位值,复杂度O(30*n*n) 1 #include <iostream> 2 #include <cstdio> 3 #include <

BZOJ_1005_ [HNOI2008]_明明的烦恼_(组合数学+purfer_sequence+高精度+分解因数)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1005 一棵树有n个点,给出没给节点的度,如果没有限制则为-1,求共有多少种可能的树. 分析 蒟蒻我肯定是不会做的,所以先来抄一段题解... 这题需要了解一种数列: Purfer Sequence 我们知道,一棵树可以用括号序列来表示,但是,一棵顶点标号(1~n)的树,还可以用一个叫做 Purfer Sequence 的数列表示 一个含有 n 个节点的 Purfer Sequence 有 n-

POJ1942——Paths on a Grid(组合数学)

Paths on a Grid DescriptionImagine you are attending your math lesson at school. Once again, you are bored because your teacher tells things that you already mastered years ago (this time he's explaining that (a+b)2=a2+2ab+b2). So you decide to waste

【2015暑假】鸽巢原理总结 【算法思路+组合数学】

组合数学之鸽巢原理 如果要把n+1物体放进n个盒子里,那么至少会有一个盒子包含2个或2个以上的物体. 现在问题来了:给你n个数,从中选出若干个数使得它们的和为n的倍数. 鸽巢原理表示:一定存在若干个连续的数,它们的和是n的倍数. 有的情况下,不光要知道一定存在,而且还要找出是哪些数,算法如下: n = 4; a[]:3  2  1  9 s[]:3  5  6  15   (注:) 先检查s[]中有没有某个s[i]%n==0,如果存在,那么这些数字它们加起来就可以整除n.如果不存在,那么由基本定

best coder #35-01&lt;组合数学 || 概率数学&gt;

问题描述 一个盒子里有n个黑球和m个白球.现在DZY每次随机从盒子里取走一个球,取了n+m次后,刚好取完.DZY用这种奇怪的方法生成了一个随机的01串S[1?(n+m)].如果DZY第i次取出的球是黑色的,那么S[i]=1,如果是白色的,那么S[i]=0. DZY现在想知道,'01'在S串中出现的期望次数. 输入描述 输入有多组测试数据. (TestCase≤150) 每行两个整数, n, m(1≤n,m≤12) 输出描述 对于每个测试数据,输出一行答案,格式为p/q(p,q互质). 输入样例

POJ1850——Code(组合数学)

Code DescriptionTransmitting and memorizing information is a task that requires different coding systems for the best use of the available space. A well known system is that one where a number is associated to a character sequence. It is considered t