【组合数学】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");
 }
}

原文:http://blog.csdn.net/tengweitw/article/details/30265107

作者:nineheadedbird

时间: 2025-01-21 17:53:07

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

Scalaz(36)- Free :实践-Free In Action - 实用体验

 在上面几期讨论中我们连续介绍了Free Monad.因为FP是纯函数编程,也既是纯函数的组合集成,要求把纯代码和副作用代码可以分离开来.Free Monad的程序描述(AST)和程序实现(Interpretation)关注分离(separation of concern)模式恰恰能满足FP要求.我们可以用一些代数数据类型(ADT Algebraic Data Type)来模拟功能,再把这些ADT组合起来形成AST(Abstract Syntax Tree).AST既是对程序功能的描述,它的组成

app-哪位朋友能告诉我一下:对于36氪、知乎、网易新闻这类APP,详细内容页面是如何获取的

问题描述 哪位朋友能告诉我一下:对于36氪.知乎.网易新闻这类APP,详细内容页面是如何获取的 它们上面的详细页面中的内容是如何获取的,我自己理解的是APP端通过webview从网页端直接获取(而不是通过http连接让服务器端返回数据,然后动态添加到APP端的Imageview和textview来显示图片和内容,我对网页部分开发不是特别了解,如果说是通过webview获取的,那么有没有什么格式要求.求大神解答 解决方案 如果是直接获取,就一定有相应的网址吧.如果有网址,那么在 IE 浏览器中也应

HTML5手机2013将达10亿部 今年3.36亿部

原文:http://mobile.csdn.net/a/20111208/308764.html 12月8日消息,市场调查机构Strategy Analytics发布调查报告预测,2011年全球支持HTML5技术的手机为3.36亿部,到2013年将增长至10亿部.其中大部分增长来自北美.欧洲及亚洲市场. Strategy在报告中特别说明"HTML5手机"是指那些手机浏览器能够完美支持全部HTML5功能的手机,iPhone 4S等. Strategy的执行理事尼尔·莫斯顿(Neil Ma

网站设计36条原则

设计 设计网站中有哪些关键技巧?有哪些陷阱?在这里,世界上一流的网站设计专家,让你共享他们的秘密,告诉你:使网站赋予情趣的诀窍.应该避免做什么.应使用什么工具软件以及他们喜爱和厌恶的网站.01 明确内容 如果你想成为一个网站设计者,并正想建一个网站的话,首先应该考虑网站的内容,包括网站功能和你的用户需要什么.你的整个设计都应该围绕这些方面来进行.02 抓住用户如果用户不能够迅速地进入你的网站,或操作不便捷,网站设计就是失败的.不要让用户失望而转向你的对手的网站.03 优化内容 内容是核心.大约在

Dreamweaver网页制作超级技巧36则

dreamweaver|技巧|网页 1. 用Dreamweaver 4.0轻松设计会自动弹性调整的网页 首先需要保证的是你的页面内容采用了表格的格式,然后打开你要编辑的页面,按"Ctrl+F6"或者菜单"View→TableView→Layout?View"转换到布局视图.这时可以看到单元格的列宽,在列宽数字的旁边还有一个小小的下拉式箭头,点击你要设定弹性显示的列上方的小箭头,接着选择"将列设为弹性显示"(Make Column Autostre

Dreamweaver MX 2004视频宝典教程(36)

dreamweaver|教程 第 36 集:有序列表 课程目标:掌握有序列表及常见属性的功能. 课程要点:有序列表<ol><li>,常见的两个属性有type和start,type可以设置数字,小宝字母,大写字母,小官罗马数字,大写罗马数字.start用于设置起始数字,默认是从1开始的. [全屏观看] | [下载视频] |

折叠纸张艺术应用在LOGO设计上的36个实例

折纸是日本著名的折叠纸张的艺术.折纸艺术只是使用一些不同的折叠方式,却能被用各种各样的方式组合成错综复杂的设计.而受折纸启发的logo设计则是一种新的logo设计趋势. 本文将列出36个受折纸启发的logo设计. PS:事实上,折纸艺术发源于中国,但是人们普遍认为折纸在日本才得到真正的发展.在中国古代,折纸主要是孩子用作消遣的一门传统艺术,后来经日本人吉泽章加以改良,使之复兴. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.

稳扎稳打Silverlight(36)

返回"稳扎稳打Silverlight 3.0系列文章索引" 稳扎稳打Silverlight(36) - 3.0控件之TreeView,ListBox增强,DataGrid增强,MediaElement增强 介绍 Silverlight 3.0 控件一览: TreeView - 树控件 ListBox - 改进:支持多选 DataGrid - 改进:结合 PagedCollectionView 实现数据分组, 增加了一些编辑数据的相关事件, 结合 DataAnnotations 实现数据

PHP开发框架Yii Framework教程(36) Zii组件-DatePicker示例

CJuiDatePicker 用于日期输入,它封装了 JUI datepicker插件,其基本用法如下: <?php echo $form->errorSummary($model); ?> <?php $this->widget('zii.widgets.jui.CJuiDatePicker', array( 'name'=>'my_date', 'language'=>'en', 'options'=>array( // 'show' (the defa