蛇形環形矩陣


蛇形環形矩陣是一種從外到里或者從里到外環繞的矩陣,就像蛇一樣一圈圈盤旋,由此成為蛇形環繞矩陣, 如下圖就是簡單的從外向里包圍蛇形環繞矩陣。

  

  打印這種矩陣可以采用分治思想,即將問題分解成子問題求解,每次打印最外一圈,依次向里,直到結束為止。比如上述圖中,最外一層依次從上往下(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; }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM