列表

详情


BC134. 蛇形矩阵

描述

给你一个整数n,输出n∗n的蛇形矩阵。

输入描述

输入一行,包含一个整数n

输出描述

输出n行,每行包含n个正整数,通过空格分隔。

1<=n<=1000

示例1

输入:

4

输出:

1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 304KB, 提交时间: 2022-07-25

#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	int count = 1;
	int row = 0, col = 0;
	int arr[50][50] = { 0 };
	int i = 0;
	while (count <= n * n)
	{
		for (i = 0; i < 2; i++)
		{
			if (row < n && col < n)
			{
				arr[row][col] = count++;
			}
			col++;
		}
		col--;
		while (col)
		{
			row++;
			col--;
			if (row < n && col < n)
			{
				arr[row][col] = count++;
			}
		}
		row++;
		while (row)
		{
			if (row < n && col < n)
			{
				arr[row][col] = count++;
			}
			row--;
			col++;
		}
	}
	for (row = 0; row < n; row++)
	{
		for (col = 0; col < n; col++)
		{
			printf("%d ", arr[row][col]);
		}
		printf("\n");
	}
	return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 316KB, 提交时间: 2022-05-22

#include<stdio.h>
int main(void){
    int i,j,a[100][100],n,k;
    scanf("%d",&n);
    k=1;
    //上三角
    for(i=0;i<n;i++){
        for(j=0;j<=i;j++){
            if(i%2==0)
                a[i-j][j]=k;
            else
                a[j][i-j]=k;
            k++;
        }
    }
    for(i=n;i<2*n-1;i++){
        for(j=1;j<2*n-i;j++){
            if(i%2==0)
                a[n-j][j+i-n]=k;
            else
                a[j+i-n][n-j]=k;
            k++;
        }
    }
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            printf("%d ",a[i][j]);
        }
        printf("\n");
    }
}

C 解法, 执行用时: 2ms, 内存消耗: 328KB, 提交时间: 2022-07-31

#include<stdio.h>

int main()
{
    int n=0;
    scanf("%d",&n);
    int str[101][101];
    int limit=2;
    int row =0;
    int col=0;
    int num =2;
    int dir=0;
    int state=0;
    str[0][0]=1;
    str[n-1][n-1]=n*n;
    int delta=1;
    int i=0;
    int j=0;
    while(num<n*n-1)
    {
        if(!dir)//斜向下
        {
            if(!state)
            {
                str[row][++col]=num++;
                while(col>0&&row<limit)
                {
                    str[++row][--col]=num++;
                }
            }
            else
            {
                str[++row][col]=num++;
                while(col>n-limit &&row<n)
                {
                    str[++row][--col]=num++;
                }
            }
        }
        else//斜向上
        {
            if(!state)
            {
                str[++row][col]=num++;
                while(row>0&&col<limit)
                {
                    str[--row][++col]=num++;
                }
            }
            else
            {
                str[row][++col]=num++;
                while(row>n-limit&&col<n)
                {
                    str[--row][++col]=num++;
                }
            }
        }
        if(limit==n)
        {
            delta=-1;
            state=1;
        }
        limit+=delta;
        dir=!dir;
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            printf("%d ",str[i][j]);
        }
        printf("\n");
    }
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 328KB, 提交时间: 2022-05-30

#include <stdio.h>

#include <stdio.h>
int arr[100][100] = { 0 };
int main()
{
    int n = 0;
    scanf("%d",&n);
    int i = 1, j = 1, k = 0,pos = 1; 
    arr[i][j] = 1;
    for (k = 2; k <= n*n; k++)
    {
        if (i == 1 && j <n && pos ==1) 
        {
            arr[i][++j] = k;
            pos = -1;                 
        }
        else if(j==1 && i<n && pos == -1)
        {
            arr[++i][j] = k;
            pos = 1;                                    
        }
        else if (j == n && pos==1) 
        {
            arr[++i][j] = k;
            pos = -1;                     
        }
        else if (i == n && pos ==-1) 
        {
            arr[i][++j] = k;
            pos = 1;
        }
        else if (pos == 1)         
        {
            arr[--i][++j] = k;
        }
        else if(pos == -1)
        {
            arr[++i][--j] = k;
        }
    }
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= n; j++)
            printf("%d ",arr[i][j]);
        printf("\n");
    }
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 332KB, 提交时间: 2022-07-29

#include<stdio.h>

int main()
{
    
    int n;
    scanf("%d",&n);
    int arr[n][n];
    arr[0][0]=1;
    int pos=1;//表示方向,1是右上,-1是左下
    int j=0,k=0;//j是行 k是列
    for(int i=2;i<=n*n;i++)//进去站的那个位置开始准备走
    {
        
        if(j==0&&pos==1&&k<n-1 )//碰到天花板
        {    arr[j][++k]=i;
            pos=-1;
        }
        else if(k==0&&pos==-1&&j<n-1)//碰到左边边界
        {
            arr[++j][k]=i;
            pos=1;
        }
        else if(j==n-1&&pos==-1&&k<n-1)//碰到地板
        {
            arr[j][++k]=i;
            pos=1;
        }
        else if(k==n-1&&pos==1&&j<n-1)//碰到右边边界
        {
            arr[++j][k]=i;
            pos=-1;
            
        }      
        else if(pos==1)
        {
            
            arr[--j][++k]=i;
        }
        else if(pos==-1)
        {
            arr[++j][--k]=i;
        }
        
        
        
    }
    
    
    
    for(int i=0;i<n;i++) {
        for (int j = 0; j < n ; j++) {
            printf("%d ",arr[i][j]);
        }
        printf("\n");
    }
    
}

上一题