20200310之蛇形矩阵 (模拟)

题目描述
蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。

输入
本题有多组数据,每组数据由一个正整数N组成。(N不大于100)

输出
对于每一组数据,输出一个N行的蛇形矩阵。两组输出之间不要额外的空行。矩阵三角中同一行的数字用一个空格分开。行尾不要多余的空格。

样例输入
5

样例输出
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11

纯模拟,蛇形走,看答案写代码:

#include <bits/stdc++.h>
using namespace std;
int a[101][101]; 
int main(){ 
	int n;  //矩阵行数 
	scanf("%d",&n);
	int x=1,y=1; //起始(1,1)点 
	int num=1;
	while(1){
		a[x][y]=num++;
		if(x==1){
			if(y==n)  //蛇形走完了,退出循环 
				break;
			x=y+1; //蛇形走 
			y=1;   
		}
		else{
			x--;
			y++; 
		} 
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n-i+1;j++){
			printf("%d",a[i][j]);
			if(j==n-i+1)
				printf("\n");
			else
				printf(" ");
		}
	return 0; 
}

下面是摘抄题解……
这种题目往往都是找出各个元素之间的规律。

1 我们可以发现,每一行的首元素之间的规律为:

a(n) = a(n - 1) + n - 1;

a(1) = 1;

这个结论很容易就用一个for循环实现。

2 再找出每一行元素之间的规律:

当输入的正整数为N时,第rows行将要输出 N-rows+1 个元素,而每行首元素和首元素下一个元素之间的增量inc为 rows+1,往后元素之间增量加1。

知道上面的规律之后就可以写程序了,参考代码如下:

#include <stdio.h>
 
//N为总行数,rows为第几行,打印该行数据
void printN(int N, int rows)
{
    //确定第rows行的第一个元素的值:a(n) = a(n-1) + n - 1; a1 = 1;
    int first = 1;
    int i;
    for (i = 1; i <= rows; i++)
    {
        first += i - 1;
    }
 
    //第rows行的第一个元素为first
    int tmp = first;
    //第rows行的元素之间的增量inc从rows+1开始
    int inc = rows + 1;
    for (i = 1; i <= N - rows + 1; i++) //输出第rows行的元素,共有N-rows+1个
    {
        //输出元素时,该行最后一个元素后面没有空格符
        if (i < (N - rows + 1))
            printf("%d ", tmp);
        else
            printf("%d", tmp);
 
        tmp += inc; //每一个元素都是前一个元素加上inc
        inc++;      //inc++
    }
}
 
int main()
{
    int N;
    scanf("%d", &N);
 
    //输出N行数据
    int i;
    for (i = 1; i <= N; i++)
    {
        printN(N, i);
        printf("\n");
    }
 
    return 0;
}

找规律。两个办法都蛮好的,这个规律有点复杂要好好理解啊!

发布了37 篇原创文章 · 获赞 0 · 访问量 373

猜你喜欢

转载自blog.csdn.net/weixin_45351699/article/details/104786678