当前位置:首页 科普知识 三十六军官问题

三十六军官问题

发布时间:2023-09-04 22:51:38

大数学家欧拉曾提出一个问题:即从不同的6个军团各选6种不同军阶的6名军官共36人,排成一个6行6列的方队,使得各行各列的6名军官恰好来自不同的军团而且军阶各不相同,应如何排这个方队?如果用(1,1)表示来自第一个军团具有第一种军阶的军官,用(1,2)表示来自第一个军团具有第二种军阶的军官,用(6,6)表示来自第六个军团具有第六种军阶的军官,则欧拉的问题就是如何将这36个数对排成方阵,使得每行每列的数无论从第一个数看还是从第二个数看,都恰好是由1、2、3、4、5、6组成。历史上称这个问题为三十六军官问题。

三十六军官问题详细介绍

大数学家欧拉曾提出一个问题:即从不同的6个军团各选6种不同军阶的6名军官共36人,排成一个6行6列的方队,使得各行各列的6名军官恰好来自不同的军团而且军阶各不相同,应如何排这个方队?如果用(1,1)表示来自第一个军团具有第一种军阶的军官,用(1,2)表示来自第一个军团具有第二种军阶的军官,用(6,6)表示来自第六个军团具有第六种军阶的军官,则欧拉的问题就是如何将这36个数对排成方阵,使得每行每列的数无论从第一个数看还是从第二个数看,都恰好是由1、2、3、4、5、6组成。历史上称这个问题为三十六军官问题。

三十六军官问题

三十六军官问题解决

三十六军官问题提出后,很长一段时间没有得到解决,直到20世纪初才被证明这样的方队是排不起来的。尽管很容易将三十六军官问题中的军团数和军阶数推广到一般的n的情况,而相应的满足条件的方队被称为n阶欧拉方。欧拉曾猜测:对任何非负整数t,n=4t+2阶欧拉方都不存在。t=1时,这就是三十六军官问题,而t=2时,n=10,数学家们构造出了10阶欧拉方,这说明欧拉猜想不对。但到1960年,数学家们彻底解决了这个问题,证明了n=4t+2(t≥2)阶欧拉方都是存在的。

三十六军官问题应用

这种方阵在近代组合数学中称为正交拉丁方,它在工农业生产和科学实验方面有广泛的应用。现已经证明,除了2阶和6阶以外,其它各阶3,4,5,7,8,……各阶正交拉丁方都是作得出来的。

除了上面的定义外需要注意的是每个组合不能重复,如2阶方正会出现类似如下情况:

(1,1) (2,1)

(2,2) (1,2)

由于出现类似(1,1)的重复,问题中36个军官不可能同时站在不同位置,故不满足需求,所以2阶方正不存在。根据计算机编程能很容易求得3,4,5阶的方正,由于组合众多,现举例如下:

3阶:

(1,1) (2,2) (3,3)

(2,3) (3,1) (1,2)

三十六军官问题

(3,2) (1,3) (2,1)

4阶:

(2,1) (4,4) (3,2) (1,3)

(4,2) (2,3) (1,1) (3,4)

(3,3) (1,2) (2,4) (4,1)

(1,4) (3,1) (4,3) (2,2)

5阶:

(1,1) (2,2) (3,5) (4,3) (5,4)

(4,5) (1,3) (5,2) (3,4) (2,1)

(2,4) (5,5) (4,1) (1,2) (3,3)

三十六军官问题

(5,3) (3,1) (1,4) (2,5) (4,2)

(3,2) (4,4) (2,3) (5,1) (1,5)

c++ 代码如下:

#include <iostream>#define ARMY_SIZE 5typedef struct snode {    int x;    int y;}node;void set_value(int x, int y);bool can_set(int x, int y, int i, int j);void set_next(int x, int y); node nodes;int main(void){    memset(nodes, 0, sizeof(nodes));    set_value(0, 0);    std::cout << "end..." << std::endl;     std::cin.get();     return 0; }void set_value(int x, int y){    for (int i = 1; i < ARMY_SIZE + 1; ++i) {        for (int j = 1; j < ARMY_SIZE + 1; ++j) {            if (can_set(x, y, i, j)) {                nodes.x = i;                nodes.y = j;                set_next(x, y);                nodes.x = 0;                nodes.y = 0;            }                    }    }}bool can_set(int x, int y, int i, int j){    for (int _x = 0; _x < x; ++_x) {        if (nodes.x == i || nodes.y == j)            return false;    }    for (int _z = 0; _z < x; ++_z) {        for (int _i = 0; _i < ARMY_SIZE; ++_i) {            if (nodes.x == i && nodes.y == j) {                return false;            }        }    }    for (int _y = 0; _y < y; ++_y) {        if (nodes.x == i || nodes.y == j)            return false;    }    return true; }void set_next(int x, int y){    if (y + 1 == ARMY_SIZE) {        if (x + 1 == ARMY_SIZE) {            for (int i = 0; i < ARMY_SIZE; ++i) {                for (int j = 0; j < ARMY_SIZE; ++j) {                    std::cout << "(" << nodes.x << "," << nodes.y << ") ";                }                std::cout << std::endl;            }            std::cout << "*************************************" << std::endl;        } else {            set_value(x + 1, 0);        }    } else {        set_value(x, y + 1);    }}

温馨提示:
本文【三十六军官问题】由作者 百科科普 转载提供。 该文观点仅代表作者本人, 自学教育网 信息发布平台,仅提供信息存储空间服务, 若存在侵权问题,请及时联系管理员或作者进行删除。
(c)2008-2025 自学教育网 All Rights Reserved 汕头市灵创科技有限公司
粤ICP备2024240640号-6