数组7——二维数组5——打印拉丁方阵

打印拉丁方阵。N×N的拉丁方阵的每一行,每一列均为自然数1,2,3,…  ,N的全排列,每一行和每一列均无重复数字。一个5×5的拉丁方阵

如图所示

《数组7——二维数组5——打印拉丁方阵》

【分析】
生成拉丁方阵的方法如下:
(1)第一行元素由随机数产生,从1开始,依次将自然数1–N填充到第一行,填入的列号由随机数产生。
(2)以第一行作为方阵的索引,即如果第一行的第i个元素值为j,则a[0][j]在各行中的列号是在第一行中从位置i开始读到的N个自然数。例如,第一行第四个元素为2,则从第四个元素开始独处的5个数依次是2,5,1,4,3,分别是元素a[0][2](值为4)在各行的列号。
main.cpp

#include<stdio.h>
#include<stdlib.h>
#include <iostream>
using namespace std;
#define N 20
void Latin_Square(int n, int a[][N]);
void main()
{
	int i, j, n;
	int latin[N][N];
	printf("请输入矩阵的阶n=");
	scanf("%d", &n);
	for (i = 0; i < n; i++)
		for (j = 0; j < n; j++)
			latin[i][j] = 0;
	Latin_Square(n, latin);
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
			printf("%4d", latin[i][j]);
		printf("\n");
	}

	system("pause");
}
void Latin_Square(int n, int a[][N])
{
	int i, j, sub, index;
	for (i = 1; i <= n; i++)
	{
		do
		{
			index = rand() % n;
		} while (a[0][index] != 0);
		a[0][index] = i;
	}
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
			if (a[0][j] == i + 1)
				break;
		sub = j + 1;
		for (j = 1; j < n; j++)
			a[j][a[0][(sub++) % n] - 1] = a[0][i];
	}
}

结果:

《数组7——二维数组5——打印拉丁方阵》

 

    原文作者:拉丁方阵问题
    原文地址: https://blog.csdn.net/baidu_36669549/article/details/84994232
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞