- /*
- 给一维数组输入任意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.codesnippet.cn/detail/231220138197.html
来源: http://www.codesnippet.cn/detail/231220138197.html