CodeRookie


私信TA

用户名:Shmily124

访问量:133447

签 名:

清风前烹茶对弈,明月下把酒言欢

等  级
排  名 14
经  验 22966
参赛次数 7
文章发表 39
年  龄 0
在职情况 学生
学  校 ZUA
专  业 计科

  自我简介:

悄悄地秃头,然后惊艳所有人?

解题思路:

围墙法,或者叫设限法,定义二维数组时多一圈,并把多出的一圈赋值为 2147483647 (整型的最大值)

同样的,把已经输出的数也赋值为 2147483647 , 作为界限

当已输出的个数小于 m * n 且当前方向下一个数不为 2147483647 时,循环输出即可


参考代码:

#include <stdio.h>
 
int main()
{
    int m, n;
    scanf("%d %d", &m, &n);
    int a[m + 2][n + 2];                                //定义时多出两行两列,即多一圈
    for (int i = 0; i <= m + 1; i++)
    {
        for (int j = 0; j <= n + 1; j++)
        {
            if (i == 0 || i == m + 1 || j == 0 || j == n + 1)   //判断是否为最外层
                a[i][j] = 2147483647;                           //是则赋值2147483647
            else
                scanf("%d", &a[i][j]);                  //否,则输入
        }
    }
    if (m && n)
        printf("%d", a[1][1]);                          //为避免结尾空格,先输出a[1][1]
    a[1][1] = 2147483647;                               //已输出的数赋值为2147483647
    int x = 1, y = 1, count = 1;                        //定义x为行下标,y为列下标,初始化为1
    while (count < m * n)                               //count表示已输出的个数
    {
        while (a[x + 1][y] != 2147483647 && ++count)    //若下方非界限,则行向下,count+1
        {
            printf(" %d", a[++x][y]);                   //此处x先自加再输出
            a[x][y] = 2147483647;
        }
        while (a[x][y + 1] != 2147483647 && ++count)    //若右方非界限,则列向右,count+1
        {
            printf(" %d", a[x][++y]);                   //此处y先自加再输出
            a[x][y] = 2147483647;
        }
        while (a[x - 1][y] != 2147483647 && ++count)    //若上方非界限,则行向上,count+1
        {
            printf(" %d", a[--x][y]);                   //此处x先自减再输出
            a[x][y] = 2147483647;
        }
        while (a[x][y - 1] != 2147483647 && ++count)    //若左方非界限,则列向左,count+1
        {
            printf(" %d", a[x][--y]);                   //此处y先自减再输出
            a[x][y] = 2147483647;
        }
    }
    return 0;
}


 

0.0分

2 人评分

  评论区

  • «
  • »