C++經典編程題目(四)拉丁方陣

 在N行N列的數陣中, 數K(1〈=K〈=N)在每行和每列中出現且僅出現一次,這樣的數陣叫N階拉丁方陣。例如下圖就是一個五階拉丁方陣。
 編一程序,從鍵盤輸入N值後,打印出所有不同的N階拉丁方陣,並統計個數。
        1  2  3  4  5
        2  3  4  5  1
        3  4  5  1  2
        4  5  1  2  3
        5  1  2  3  4

#include <iostream>
#include <stdio.h>

using namespace std;

void printM(int M)
{
	//只有一個數的時候輸出1
	if (M == 1)
	{
		printf("1");
	}

	//生成在拉丁方陣中出現的數據序列
	int *elementArray = new int[M];
	for (int i = 0; i < M; i++)
	{
		elementArray[i] = i + 1;
	}

	//動態生成一個二維數組
	int **shouList = new int*[M];//開闢行
	for (int i = 0; i < M; i++)
		shouList[i] = new int[M]; //開闢列

	for (int i = 0; i < M; i++)
	{
		//寫入一行方陣
		for (int k = 0; k < M; k++)
		{
			shouList[i][k] = elementArray[k];
		}

		//將數據序列循環左移一位
		int temp;
		temp = elementArray[0];
		for (int i = 0; i < M - 1; i++)
		{
			elementArray[i] = elementArray[i+1];
		}
		elementArray[M - 1] = temp;
	}

	//打印方陣
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < M; j++)
		{
			printf("%2d", shouList[i][j]);
		}
		printf("\n");
	}

};

int main()
{
	int M = 0;
	printf("Please input M :");
	scanf_s("%d",&M);
	printM(M);
	system("pause");
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章