n个数的拉丁方阵 跳至 [1] [全屏预览]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
/*
给一维数组输入任意6个整数,假设为:
7 4 8 9 1 5
请建立一个具有以下内容的方阵:
7 4 8 9 1 5
4 8 9 1 5 7
8 9 1 5 7 4
9 1 5 7 4 8
1 5 7 4 8 9
5 7 4 8 9 1
分析:由上得 从第二行开始,第一个数等于上一行第二个数,第二个 数等于上一行第3个数 ... 最后一个数等于上一行
的第一个数
可用一个二维数组数据,先往第一行输入6个数字 作为下一行输出的一个标准 ,在以上述规律进行输出
先要输出拉丁方所有的可能 ,第一行确定了输出的模板了,记下来只要改变第一行数字就行了,及给第一行的数字排序
共有多少个了,共有n个全排列(n!)个 ,下面用了这样一种排列方式:把第一个数和后面两个数去交换就ok了
*/
#include<iostream>
using
namespace
std;
int
main()
{
int
i,j,k;
int
n;
unsigned
long
int
sum = 1,kj=0;
//往第一行中写入标准数
cout<<
"请输入几阶拉丁数字:"
;
cin>>n;
int
a[n][n];
cout<<
"请输入"
<<n<<
"个数字:"
;
for
(i=0; i<1; i++)
{
for
(j=0; j<n; j++)
{
cin>>a[i][j];
}
}
//求n个数的所有拉丁方阵的个数 = n!
for
(i=n; i>0; i--)
{
sum = sum*i;
}
cout<<
"前20个如下:"
<<endl;
for
(k=0; k<sum; k++ )
//输出sum个拉丁方阵
{
int
temp;
if
(k>0)
//第二次时就开始交换第一行的数据
{
kj++;
temp = a[0][0];
//第一行第一个数和它后面的n-1个数进行交换数据
a[0][0] = a[0][kj];
a[0][kj] = temp;
if
(kj == n-1)
//如果第一个数和后面n-1数都交换了,在重新将kj置0,在重新开始,直到所有拉丁
{
// 个数交换完毕
kj = 0;
}
}
if
(k>20)
//为便于大家看到答案 最大输出20种结果
{
break
;
}
//输出拉丁矩阵
for
(i=0; i<n; i++)
{
for
(j=0; j<n; j++)
{
if
(i>0)
//从第二行开始
{
a[i][j] = a[i-1][j+1];
//每个数等于其右上角的数
a[i][n-1] = a[i-1][0];
//每行最后一个数等于其上一行的第一个数
}
cout<<a[i][j]<<
" "
;
}
cout<<endl;
//输出一行就换一行
}
cout<<endl;
}
cout<<n<<
"个数共有"
<<sum<<
"种不同拉丁方阵"
<<endl;
system
(
"pause"
);
return
0;
}
|