C++蛇形矩阵(入门思维)

一,蛇形矩阵样例展示

(闲来无事做一做,完整代码放最后了)

蛇形矩阵,顾名思义就是长的像蛇盘旋呢个样子的矩阵,咱话不多说,看下面的范例:

二,个人思路展示

那代码如何实现输入行数和列数,输出一个蛇形矩阵呢?

首先我设两个变量m,n去接收用户输入的行数,列数。设一个二维数组去保存我将要生成的蛇形矩阵。设r,l来控制矩阵坐标。设a去来给矩阵每个位置赋值(初始map[0][0]为1)。然后我又设置j,k去存储我输入的m,n。(这里变量设置的挺多,肯定还有优化的地方,不过我认为思路上还是比较简洁,没什么难的地方,咱看明白就中)

    int m,n;

    int map[10][10]= {0};
    int r=0,l=0;
    cin>>m>>n;
    int a=1;
    int j=n,k=m;

三,主体实现说明及代码展示 

然后是主体实现部分,通过观察蛇形矩阵,我发现实现蛇形矩阵的难点在于它如何控制坐标的移动,让我的r,l变量可以由外向内顺时针走动。

我的思路是,找到蛇形矩阵的每个拐角点对应的矩阵坐标运动轨迹。因为蛇形矩阵的运动轨迹其实是固定的四个方向:1.  r不变,l++;2.  r--,l不变;3.  r不变,l--;4.  r--,l不变。这四个方向是不断从1.到4.循环进行的,另外,一个问题是我每次改遍历多少次的问题,我的答案是,横向按行数依次递减,也就是,横向第一次遍历m次,第二次遍历m-1次,等等。纵向第一次遍历n-1次,第二次遍历n-2次,等等。

因此综上我们大致可以总结出,矩阵的第几次拐角点需要我们进行哪个方向的多少次遍历赋值。(其实就是拿第几次拐角去%4,然后四种情况分别讨论四个方向),如下我的实现代码中:

for(int time=0; time<=2*m-1&&time<=2*n-1; time++) {
        if(time%4==0) {
            for(int j1=0; j1<j; j1++) {
                map[r][l]=a++;
                if(j1!=j-1)
                    l++;
            }
            j--;
            r++;
        }
        if(time%4==2) {
            for(int j1=0; j1<j; j1++) {
                map[r][l]=a++;
                if(j1!=j-1)
                    l--;
            }
            j--;
            r--;
        }
        if(time%4==1) {
            for(int k1=0; k1<k-1; k1++) {
                map[r][l]=a++;
                if(k1!=k-2)
                    r++;
            }
            k--;
            l--;
        }
        if(time%4==3) {
            for(int k1=0; k1<k-1; k1++) {
                map[r][l]=a++;
                if(k1!=k-2)
                    r--;
            }
            k--;
            l++;
        }
    }

最后就是遍历数组,输出蛇形矩阵: 

for(int i=0; i<m; i++) {
        for(int j=0; j<n; j++) {
            cout<<setw(3)<<map[i][j];
        }
        cout<<endl;
    }

注意:二维数组存储矩阵的大小有限,你们可以自行更改初始化map[100][100],反正大小自己改;还有格式问题,这个各有各的需求,我默认的是一个数占3个位置,可以自行更改setw(3)中的数值。

四,懒人直接源码

(源码如下)

#include<iostream>
#include<iomanip>
using namespace std;
int main(void) {
    int m,n;
    int r=0,l=0;
    int map[10][10]= {0};
    cin>>m>>n;
    int a=1;
    int j=n,k=m;
    for(int time=0; time<=2*m-1&&time<=2*n-1; time++) {
        if(time%4==0) {
            for(int j1=0; j1<j; j1++) {
                map[r][l]=a++;
                if(j1!=j-1)
                        l++;
               }
               j--;
               r++;
          }
          if(time%4==2) {
               for(int j1=0; j1<j; j1++) {
                    map[r][l]=a++;
                    if(j1!=j-1)
                         l--;
           }
           j--;
           r--;
        }
        if(time%4==1) {
           for(int k1=0; k1<k-1; k1++) {
              map[r][l]=a++;
              if(k1!=k-2)
                 r++;
           }
           k--;
           l--;
        }
        if(time%4==3) {
           for(int k1=0; k1<k-1; k1++) {
              map[r][l]=a++;
              if(k1!=k-2)
                 r--;
           }
           k--;
           l++;
        }
     }
     for(int i=0; i<m; i++) {
        for(int j=0; j<n; j++) {
           cout<<setw(3)<<map[i][j];
        }
        cout<<endl;
     }
     return 0;  
}

完结!(代码肯定有很多不足,不过能解决各位问题差不多就够了,如果讲的不够详细,我会再详细解释) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值