題目: 蛇形矩陣,是由1開始的自然數一次排列成的N*N的正方形矩陣,數字依次由外而內的遞增,如下面實例:
N=3時:
1 2 3
8 9 4
7 6 5
N=6時:
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11
要求:輸入蛇形矩陣寬度,輸出蛇形矩陣結果。
將矩陣像剝洋蔥一樣,層層剝離,每一次循環爲矩陣的這一層賦值,若矩陣寬度爲偶數,則矩陣無心,若寬度爲奇數,則矩陣有心(單獨的一個數),對於這種情況需要單獨處理。
#include<iostream>
using namespace std;
void print(int n)
{
int **matrix = new int*[n];//建立二維數組
for (int k = 0; k < n; k++)
{
matrix[k] = new int[n];
}
int circle = 0;//循環次數
int v = 1;//矩陣初值
int i = 0, j = 0;
while (n-2*circle>=2)//以n-2*circle作爲mark,若矩陣寬度爲偶數,mark取到2時,矩陣賦值結束;若矩陣寬度爲奇數,mark會取到1,此時需要單獨處理。
{
for (j=circle; j < n-circle; j++)
{
matrix[i][j] = v;
v++;
}
j--;
i++;
for (i; i < n-circle; i++)
{
matrix[i][j] = v;
v++;
}
i--;
j--;
for (j; j >= circle; j--)
{
matrix[i][j] = v;
v++;
}
j++;
i--;
for (i; i > circle; i--)
{
matrix[i][j] = v;
v++;
}
i++;
circle++;
}
if (n-2*circle == 1)
{
j = circle;
matrix[i][j] = v;
}
for (i = 0; i < n; i++)//輸出矩陣
{
for (j = 0; j < n; j++)
{
cout << matrix[i][j]<<" ";
}
cout << endl;
}
}
int main( )
{
int N;
cin >> N;
print(N);
return 0;
}
如下爲運行結果: