一,蛇形矩阵样例展示
(闲来无事做一做,完整代码放最后了)
蛇形矩阵,顾名思义就是长的像蛇盘旋呢个样子的矩阵,咱话不多说,看下面的范例:
二,个人思路展示
那代码如何实现输入行数和列数,输出一个蛇形矩阵呢?
首先我设两个变量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;
}
完结!(代码肯定有很多不足,不过能解决各位问题差不多就够了,如果讲的不够详细,我会再详细解释)