蛇形環形矩陣是一種從外到里或者從里到外環繞的矩陣,就像蛇一樣一圈圈盤旋,由此成為蛇形環繞矩陣, 如下圖就是簡單的從外向里包圍蛇形環繞矩陣。
打印這種矩陣可以采用分治思想,即將問題分解成子問題求解,每次打印最外一圈,依次向里,直到結束為止。比如上述圖中,最外一層依次從上往下(1 - 4),從左往右(5 - 8),從下往上(9 - 12),從右往左(13 - 16);每次向數組寫入n-1個數,即每一圈寫入 4 *(n-1)個數據; 然后讓子規模實現下一層的操作,n = n - 2; 假設每一層開始的點都是左上角,即(0,0),(1,1),(2,2)...... 等,是從對角線開始的,所以每層的起始標志是(begin,begin),對於下一子層就是begin = begin + 1;
同時注意結束條件,即當 n = 1 時,說明矩陣是基數矩陣,最后一個元素賦值即結束,n = 0 時說明矩陣是偶數矩陣,即結束;
C++源代碼(使用循環和遞歸兩種方式):
#include<bits/stdc++.h> //集成大部分頭文件
using namespace std; int N[20][20]; void write(int& i, int& k, int &n, int &num) { //蛇形寫入數據,數據都為引用,為了不影響原操作
for(int j=1; j<n; j++) { //從上往下寫入
N[i][k] = ++num; i++; } for(int j=1; j<n; j++) { //從左往右寫入
N[i][k] = ++num; k++; } for(int j=1; j<n; j++) { //從下往上寫入
N[i][k] = ++num; i--; } for(int j=1; j<n; j++) { //從右往左寫入
N[i][k] = ++num; k--; } } void show(int n) { //打印矩陣
for(int i=0; i<n; i++) { for(int k=0; k<n; k++) { printf("%4d ", N[i][k]); } cout<< endl<< endl;; } } void snakeMatrix1(int n) { //使用循環實現蛇形矩陣
int begin = 0, num = 0, temp = n; while(n > 0) { int i, k; i = k = begin; if(n == 1) { N[i][k] = ++num; break; } write(i, k, n, num); n -= 2; begin ++; } printf("\n使用循環打印%d階蛇形矩陣: \n", temp); show(temp); } void snakeM(int n, int begin, int num) { //n:子規模大小,begin:子規模開始,num:計數
int i, k; i = k = begin; if(n == 1) { //基數矩陣判斷條件,最后一項結束就return
N[i][k] = ++num; return; } if(n == 0) { //偶數矩陣遞歸返回判斷條件
return; } write(i, k, n, num); snakeM(n-2, begin+1,num); //帶入遞歸
} void snakeMatrix2(int n) { //使用遞歸實現蛇形矩陣
memset(N, 0, sizeof(N)); //數組置位 (數組名稱,指定變更,變更大小)
snakeM(n, 0, 0); printf("使用遞歸打印%d階蛇形矩陣: \n", n); show(n); } void solve() { int num = 0; cout<< "請輸入蛇形矩陣的規模: "; cin>> num; snakeMatrix1(num); snakeMatrix2(num); } int main() { solve(); return 0; }