陣列7——二維陣列5——列印拉丁方陣
阿新 • • 發佈:2018-12-22
列印拉丁方陣。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]; } }
結果: