1. 程式人生 > >陣列7——二維陣列5——列印拉丁方陣

陣列7——二維陣列5——列印拉丁方陣

列印拉丁方陣。N×N的拉丁方陣的每一行,每一列均為自然數1,2,3,...  ,N的全排列,每一行和每一列均無重複數字。一個5×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];
	}
}

結果: