C語言經典矩陣演算法之列印魔方陣(詳解)
阿新 • • 發佈:2021-01-27
技術標籤:C語言演算法演算法c語言矩陣演算法程式人生經驗分享
文章目錄
一、矩陣演算法
1、矩陣
矩陣,是線性代數中的基本概念之一。一個m×n的矩陣就是m×n個數排成m行n列的一個數陣。由於它把許多資料緊湊的集中到了一起,所以有時候可以簡便地表示一些複雜的模型。矩陣乘法看起來很奇怪,但實際上非常有用,應用也十分廣泛。
2、矩陣演算法
矩陣演算法是一種高效的演算法,可以把一些一維遞推優化到log( n ),還可以求路徑方案等,所以更是是一種應用性極強的演算法。
3、矩陣演算法的實現
矩陣演算法通常需要使用二維陣列來實現,矩陣演算法往往需要交換或者存取矩陣中的某個元素,這就需要我們靈活掌握二維陣列兩個下標的變換。
二、列印魔方陣
1、魔方陣
魔方陣,古代又稱“縱橫圖”,是指組成元素為自然數1、2、…、n的平方的n×n的方陣,
其中每個元素值都不相等,且每行、每列以及主、副對角線上各n個元素之和都相等。
2、C語言實現
#include <stdio.h>
#define N 20
void Matrix();
void main()
{
Matrix();
}
//列印n階魔方陣的函式
void Matrix()
{
int a[N][N], n, i, j, k;
while(1)
{
printf("請輸入魔方陣的階數(n<=20,且是奇數):" );
scanf("%d", &n);
if(n!=0 && n<=20 && n%2!=0)
{
printf("%d階魔方矩陣.\n", n);
break;
}
}
//初始化二維陣列
for(i=0; i<n; i++)
for(j=0; j<n; j++)
a[i][j]= 0;
//構造魔方陣
i= 0;
j= n/2;
a[i][j]= 1; //放在第一行的中間一列
k= 2;
while(k<=n*n)
{
i= i-1; //行號減1
j= j+1; //列號加1
if(i<0 && j>n-1) //如果上一個數位與第1行第n列,當前的數應在上一個數的下面
{
i= i+2;
j= j-1;
}
else
{
//如果上一個數位與第1行,則當前的數應位與最後一行
if(i<0)
i= n-1;
//如果上一個數位與第n列,則當前的數應位與第1列
if(j>n-1)
j= 0;
}
if(a[i][j]==0) //當前的數儲存到陣列中
a[i][j]= k;
else //如果已經有數存在你,則放在上一個數的下面
{
i= i+2;
j= j-1;
a[i][j]= k;
}
k++; //k增加1,準備存放下一個數
}
//輸出魔方陣
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
printf("%4d", a[i][j]);
printf("\n");
}
}
參考文獻:《The Function and Algorithm of Program Language C/C++》