拉丁方

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;
}
http://www.oschina.net/code/snippet_247498_20014
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值