蛇形矩阵

来源:互联网 发布:淘宝达人后台在哪里 编辑:程序博客网 时间:2024/06/07 09:37
/*
思路:
(1)蛇形矩阵有一个比较大的特点,就是它的增加是对角线的增加,而对角线有一个特点就是行列之和是不变的,而且对对角线的遍历有一种方法,叫做行遍历法
(2)行遍历法的原理(名字自己编的)
         即将对角线映射到row,让这两个形成关系,然后通过将col当做计数器来遍历
                   【1】上三角形:(col + row(检索) = row(原来))
                     有两种读法:
                     从对角线的上方读:
                              col = row;
                              while(col >= 0)
                              {
                                 a[row - col][col]
                                 col --;
                              }
                          从对角线下方读的方法:
                             col = 0;
                             while(col <= row)
                             {
                                a[row - col][col]
                                col --;
                             }
                         实际上只是col的初始值不一样而已
                  【2】下三角形(col(检索) + row(检索) = n - 1 + row(对映)(观察)
                       有两种读法:
                       从对角线的上方读:
                       col = n - 1;
                       while(col >= row)
                       {
                           a[n - 1 + row - col][col]
                           col --;
                       }
                       从对角线的下方读:
                       col = row;
                       while(col <= n - 1)
                       {
                         a[n - 1 + row - col][col];
                         col ++;
                       }
(3)经过观察,蛇形矩阵的赋值其实是将两种读法相结合,于是就有判断奇偶的判断
代码:

*/




#include <iostream>
#include <iomanip>
using namespace std;


int main()
{
    while(1)
    {
        int n ;
        cout << "请输入该蛇形矩阵的阶数" <<endl;
        cin >> n;
        if(n <= 0)
            break;
        int count = 1 , a[n][n];
        int row , col;
        for(row = 0; row  <  n;row ++)
        {
            if(row % 2 != 0)
            {
                col = row;
                while(col >= 0)
                {
                    a[row - col][col] = count;
                    count ++;
                    col --;
                }


            }
            else
            {
                col = 0;
                while(col <= row)
                {
                   a[row - col][col] = count;
                   count ++;
                   col ++;
                }


            }
        }
       for(row = 1;row <= n;row ++)
       {
           if(row % 2 == 0)
           {
               col = n - 1;
               while(col >= row)
               {
                   a[n - 1 + row - col][col] = count;
                   count ++;
                   col --;
               }
           }
           else
           {
               col = row;
               while(col <= n - 1)
               {
                   a[n - 1 + row - col][col] = count ;
                   count ++;
                   col ++;
               }
           }
       }
       for(int i = 0;i < n;i ++)
       {
           for(int j = 0;j < n ; j++)
           {
               cout <<left << setw(4) <<  a[i][j];
           }
           cout << endl;
       }
    }
    return 0;
}