欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

《算法竞赛入门经典(第2版)》第三章重要例题,蛇形填数

程序员文章站 2024-03-18 23:30:28
...

蛇形填数

#include <stdio.h>
#include <string.h>
#define maxn 10
int a[maxn][maxn];
int main()
{  int n=0;int t=1;int G=1;
    memset(a,0,sizeof(a));//初始化二维数组
    scanf("%d",&n);//输入n
    int l=n;//我定义n为可变的,l为不可变的
    while(t<=l*l)//t是计数器,每走一格会加1,比如输入n=3,如果t=10就跳出循环了,这也说明3的蛇形队列不存在10
  {
    for(int i=G;i<=n;i++)//向下走
    {
        a[i][n]=t;//printf("a(%d,%d)=%d\n",i,n,t);//给向下走过程中碰到的格子赋值
        t++;//表示下个格子的数字会加1
    }
    
    for(int i=n-1;i>=G;i--)//向左走
    {
        a[n][i]=t;//printf("a(%d,%d)=%d\n",l,i,t);//同理赋值
        t++;//同理
    }
    for(int i=n-1;i>=G;i--)//向上走
    {
        a[i][G]=t;//printf("a(%d,%d)=%d\n",i,G,t);//同理赋值
        t++;//同理
    }
        n--;//边界移动一个单位
    for(int i=G+1;i<=n;i++)//向右走
    {
        a[G][i]=t;//printf("4a(%d,%d)=%d\n",G,i,t);
        t++;
    }
        
        G++;//起点增加一个单位
  }
    for(int i=1;i<=l;i++)//输出结果
    {
        for(int j=1;j<=l;j++)
        {printf("%3d",a[i][j]);}
        printf("\n");
    }
    return 0;
}