首页 > 试题广场 >

蛇形矩阵

[编程题]蛇形矩阵
  • 热度指数:6110 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给你一个整数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
#include <stdio.h>
int main() {
    int a, k = 2, i = 0, j = 1;
    scanf("%d", &a);
    int arr[a][a];
    arr[0][0] = 1;
    while (1)
    {
        arr[i][j] = k++;
        while (j > 0)
        {
            i++, j--;
            arr[i][j] = k++;
        }
        if (i + j >= a - 1)
            break;
        i++;
        arr[i][j] = k++;
        while (i > 0)
        {
            i--, j++;
            arr[i][j] = k++;
        }
        if (i + j >= a - 1)
            break;
        j++;
    }
    for (i = 1; i < a; i++)
    {
        for (j = a - i; j < a; j++)
        {
            arr[i][j] = a * a + 1 - arr[a - 1 - i][a - 1 - j];
        }
    }
    for (i = 0; i < a; i++)
    {
        for (j = 0; j < a; j++)
        {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}
发表于 2025-04-29 02:40:55 回复(0)
#include<stdio.h>
void snake_matrix(int arr[1000][1000],int n)
{
   int i = 0;
   int j = 0;
   int sum = 1;
   int k = 0;
    while(sum <= n*n)
    {
        while(k < n-1)   //上三角 
        {
            if(k % 2==0)
            {
               while(i>=0)  //斜向上
               {
                 arr[i][j]=sum;
                 sum++;
                 i--;
                 j++;
               }
               i++;       //校正起点
               k++;
            }
            if(k==n-1)
            break;
            if(k % 2 != 0)
            {
               while(j>=0)  //斜向下
               {
                  arr[i][j]=sum;
                  sum++;
                  j--;
                  i++; 
               }
               j++;   //校正起点
               k++;
            }
            if(k==n-1)
            break;
        }
        while(k >= n-1) // 下三角
        {
            if(k % 2 != 0)  //斜向下
            {
               while(i<=n-1)
               {
               arr[i][j]=sum;
               sum++;
               i++;
               j--;                
               }
               j=j+2;    //校正起点
               i--;
               k++;
            }
            if(k % 2 == 0) //斜向上
            {
                while(j<=n-1) 
                {
                    arr[i][j]=sum;
                    sum++;
                    j++;
                    i--;
                }
                i = i+2;   //校正起点
                j--;
                k++;
            }
            if(sum>=n*n)
            {
                break;
            }
        }
        
    }  
  
}
void printf_snake(int arr[1000][1000],int n ) //打印
{
    int i = 0;
    int j = 0;
    for(i=0;i<n;i++)
    {
         for(j=0;j<n;j++)
         {
           printf("%d ",arr[i][j]);
         }
         printf("\n");
    }
}

int main()
{
    int n = 0;
    scanf("%d",&n);
    int arr[1000][1000];
    snake_matrix(arr,n);
    printf_snake(arr,n);
    return 0;
}

发表于 2025-01-03 09:47:11 回复(0)
#include <stdio.h>
//拐弯分为u1横拐和u2竖拐,横拐行不变 列加一;竖拐列不变 行加一
//其他运动方式k分为k1斜上和k2斜下。 斜上:行递减,列递加;斜下:行递加,列递减
//k1,k2,u1,u2与n的关系:
int main() {
    int n = 0;
    int i = 0, j = 0;
    int nj = 0;
    int ni = 0;
    scanf("%d", &n);
    if (n == 1) {
        printf("1 ");
        return 0;
    }
    int arr[20][20] = { 0 };
    int a = 1;
    arr[0][0] = a;
    a++;
    while (a < n * n - 2) {
        if (j < n - 1) {
            j++;
        } else {
            nj++;
            j++;
            while (j > (1 + ni)) {
                j--;
                i++;
                arr[i][j] = a;
                a++;
            }

            ni++;

            goto star1;
        }
        arr[i][j] = a;
        a++;
        while (j > 0) {
            j--;
            i++;
            arr[i][j] = a;
            a++;
        }
star1:
        if (i < n - 1) {
            i++;
        } else {
            ni++;
            i++;
            while (i > (1 + nj)) {
                i--;
                j++;
                arr[i][j] = a;
                a++;
            }

            nj++;

            goto star2;
        }
        arr[i][j] = a;
        a++;
        while (i > 0) {
            i--;
            j++;
            arr[i][j] = a;
            a++;
        }
star2:
        ;
    }
    arr[n - 2][n - 1] = a;
    a++;
    arr[n - 1][n - 2] = a;
    a++;
    arr[n - 1][n - 1] = a;
    for (int u = 0; u < n; u++) {
        for (int v = 0; v < n; v++) {
            printf("%d ", arr[u][v]);
        }
        printf("\n");
    }

    return 0;
}

发表于 2024-08-14 12:41:09 回复(0)
#include <stdio.h>

int main() {
    int n,a[1005][1005],count=2;
    scanf("%d",&n);
    int row=1,col=1,ci=1;//ci指一次左斜下+一次右斜上
    a[1][1]=1;
    while(count<=n*n){
        for(int i=row,j=col+1;j>=1;i++,j--){
            if(i<=n&&j<=n)a[i][j]=count++;
        }
        for(int i=row+2*ci,j=col-2*(ci-1);i>=1;i--,j++){
            if(i<=n&&j<=n)a[i][j]=count++;
        }
        ci++;
        col+=2;//第一次循环原点(1,1),第二次循环原点(3,1),以此类推
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)printf("%d ",a[i][j]);
        printf("\n");
    }
    return 0;
}

发表于 2024-01-14 22:32:21 回复(0)
#include <stdio.h>
#include <stdlib.h>

int main() {
    int num, sequence = 1, column;
    scanf("%d ", &num);
    int** arr = (int **)malloc(sizeof(int*) * num);
    for (int i = 0; i < num; i++) {
        arr[i] = (int*)malloc(sizeof(int) * num);
    }

    for (int sum = 0; sum <= 2 * (num - 1); sum++) {
        column = (sum > num - 1)?(sum + 1 - num):0;
        for (int i = column; i <= sum - column; i++) {
            if (sum % 2 == 0) {
                arr[sum - i][i] = sequence++;
            } else {
                arr[i][sum - i] = sequence++;
            }
        }
    }

    for (int i = 0; i < num; i++) {
        for (int j = 0; j < num; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
    
    for (int i = 0; i < num; i++) {
        free(arr[i]);
    }
    free(arr);
    return 0;
}


编辑于 2024-01-04 16:57:36 回复(0)
#include"stdio.h"
int main(){
    int a;
    scanf("%d",&a);
    int an[a][a];
    int p=1;
    int l=0;
    while(1){
        if(l>a-1){
            break;
        }
        for(int x=0;x<=l;x++){
            for(int y=0;y<=l;y++){
                if(x+y==l&&l%2!=0){
                    an[x][y]=p;
                    an[a-x-1][a-y-1]=a*a-p+1;
                    p++;
                }
                if(x+y==l&&l%2==0){
                    an[y][x]=p;
                    an[a-y-1][a-1-x]=a*a-p+1;
                    p++;
                }
            }
        }
        l++;
    }
    for(int x=0;x<a;x++){
        for(int y=0;y<a;y++){
            printf("%d ",an[x][y]);
        }
        printf("\n"); 
    }
    return 0;
}
编辑于 2023-12-26 17:21:36 回复(0)
int main() {
    int arr[100][100];
    int n = 0, i = 0, j = 0, m = 1;
    scanf("%d", &n);
    int sum = n * n;
    while (m <= sum) {
        for (; (i >= 0) || (j >= n); ++j, --i) {
            if (j >= n) {
                j = n - 1;
                ++i;
                break;
            } else {
                arr[i][j] = m++;
            }
        }
        for (++i; (j >= 0)||(i >= n); ++i, --j) {
            if (i >= n) {
                i = n - 1;
                ++j;
                break;
            } else {
                arr[i][j] = m++;
            }
        }
        ++j;
    }
    for (i = 0; i < n; ++i) {
        for (j = 0; j < n; ++j) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}
发表于 2023-10-10 17:23:49 回复(0)
#include <stdio.h>
int judegment(int arr[1000][1000], int i, int j, int n)
{
    //判断是否在右上角
    if(i == 0 &&  j == n - 1)
        return 0;

    //判断是否在左上角或右下角    
    else if((i == 0 && j == 0) || (i == n - 1 && j == n - 1))
        return 1;

    //判断是否在数组首行或尾行    
    else if(i == 0 || i == n - 1)
        return 1;
        
    //判断是否在数组首列或尾列    
    else
        return 0;
}

int main() {
    int n;
    scanf("%d", &n);
    int arr[1000][1000] = { 0 };
    int p = 1;
    int i = 0;
    int j = 0;
    arr[i][j] = p++;
    while(p <= n * n)
    {
        //判断向哪里移动一格
        if(judegment(arr, i, j, n) == 1)
        {
            j++;
            arr[i][j] = p++;
        }
        else
        {
            i++;
            arr[i][j] = p++;
        }
        i++;
        j--;

        //向左下方移动
        while(i < n && j >= 0)
        {
            arr[i][j] = p++;
            i++;
            j--;
        }
        i--;
        j++;

        //判断向哪里移动一格
        if(judegment(arr, i, j, n) == 1)
        {
            j++;
            arr[i][j] = p++;
        }
        else
        {
            i++;
            arr[i][j] = p++;
        }
        i--;
        j++;

        //向右上方移动
        while(i >= 0 && j < n)
        {
            arr[i][j] = p++;
            i--;
            j++;
        }
        i++;
        j--;
    }

    //打印数组
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < n; j++)
        {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

发表于 2023-05-11 18:19:17 回复(0)
借鉴大佬思路
#include <stdio.h>
int main()
{
    int n = 0,k = 1;
    int i = 1,j = 1,i2 = 1,j2 = 1,i3 = 1,j3 = 1,i4 = 1,j4 = 1;
    int arr[1006][1006] = {0};
    scanf("%d",&n);
    arr[1][1] = k++;
    while( k<=n*n)
    {
        i = 1,j = j4+1;
        
        for(i3 = i,j3 = j;j3>=1;i3++,j3--)//从右到左下
        {
            if(j3<=n && j3>=1 && i3>=1 && i3<=n) arr[i3][j3]= k++;
        }
        i3--,j3++;//上面是j3>=1,所以会多减,去除多减的位置
        i2 = i3+1,j2 = 1;
        for(i4 = i2,j4 = j2;i4>=1;i4--,j4++)//从下到右上
        {
            if(j4>=1 && j4<=n && i4>=1 && i4<=n) arr[i4][j4] = k++;
        }
        i4++,j4--;//上面是i4>=1,所以会多减,去除多减的位置
    }
    for(i = 1;i<=n;i++)
    {
        for(j = 1;j<=n;j++)
        {
            printf("%d ",arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

发表于 2023-03-17 07:47:14 回复(0)
#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);
    int a[n][n];
    int i, j, z, count1 = 1;
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            a[i][j] = 0;
        }
    }
    for (j = 0; j < n; j++) {
        if (j % 2 == 0) {
            z = 0;
            for (i = j; i >= 0; i--) {
                a[i][z] = count1;
                z++;
                count1++;
            }
        } else {
            z = j;
            for (i = 0; i <= j; i++) {
                a[i][z] = count1;
                z--;
                count1++;
            }
        }
    }
    int count2 = n * n;
    if (n % 2 == 0) {
        for (j = n - 1; j > 0; j--) {
            if (j % 2 == 0) {
                z = j;
                for (i = n - 1; i >= j; i--) {
                    a[i][z] = count2;
                    z++;
                    count2--;
                }
            } else {
                z = n - 1;
                for (i = j; i < n; i++) {
                    a[i][z] = count2;
                    z--;
                    count2--;
                }
            }

        }

    } else {
        for (j = n - 1; j > 0; j--) {
            if (j % 2 == 1) {
                z = j;
                for (i = n - 1; i >= j; i--) {
                    a[i][z] = count2;
                    z++;
                    count2--;
                }
            } else {
                z = n - 1;
                for (i = j; i < n; i++) {
                    a[i][z] = count2;
                    z--;
                    count2--;
                }
            }
        }
    }
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

发表于 2022-09-23 10:31:06 回复(0)
#include<stdio.h>
int main() {
    int n, arr[1000][1000], cur = 0;
    scanf("%d", &n);
    int i = 0, j = 0;//i代表行,j代表列
    for (int k = 0; k < n - 1; k++) {   //循环次数n-1次
        int b = j;
        for (i = 0; j < b + 2; j++) {   //一次循环内的横向走向
            if (j < n)
                arr[i][j] = ++cur;
        }
        for (i = 1, j = j - 2; j >= 0; i++, j--) {   //右上到左下走向
            if (i >= 0 && j >= 0 && j < n && i < n)
                arr[i][j] = ++cur;
        }
        for (j = 0; i > 0; i--, j++) {     //左下到右上走向
            if (i >= 0 && j >= 0 && j < n && i < n)
                arr[i][j] = ++cur;
        }
    }
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++)
            printf("%d ", arr[i][j]);
        printf("\n");
    }
    return 0;
}

发表于 2022-08-04 18:20:33 回复(1)
#include <stdio.h>

int main(){
	int n, arr[20][20];
	scanf("%d", &n);
	int i, j = 0;
    int count = 0;
	arr[0][0] = ++count;
	while(count < n * n){ //每一轮拆解为 右/下 --> 斜下 --> 右/下 --> 斜上 
		if(j < n - 1)//右/下
			j++;
		else
			i++;
		arr[i][j] = ++count;
		while(i < n - 1 && j > 0){  //斜下 
			i++; j--;
			arr[i][j] = ++count;
		}
		if(i < n - 1) //右/下	
			i++;    
		else
			j++;
		arr[i][j] = ++count;
		while(i > 0 && j < n - 1){  //斜上 
			i--; j++;
			arr[i][j] = ++count;
		}
	}
	for(i = 0; i < n; i++){
		for(j = 0; j < n; j++){
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

发表于 2022-06-08 20:36:22 回复(0)
#include<stdio.h>
int main()
{
    int n,a[100][100],count=1;
    scanf("%d",&n);
    int q=0;
    while(count<=n*n)
    {
        for(int i=q;i<=q+1;i++)
            if(i<n)
                a[0][i]=count++;
        for(int i=q,j=1;i>=0;i--,j++)
            if(i<n&&j<n)
                a[j][i]=count++;
        for(int i=q+2,j=0;i>0;i--,j++)
            if(i<n&&j<n)
                a[i][j]=count++;
        q+=2;
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
            printf("%d ",a[i][j]);
        printf("\n");
    }
    return 0;
    

}

发表于 2022-06-08 14:56:24 回复(0)