1 条题解

  • 0
    @ 2024-10-13 20:03:58

    题目:ys的snake

    题目分析:

    此题与oj训练幸运99内的snake极其相似,甚至就是oj99的改编,与oj的snake不同的是,本题所输出的snake图形是矩形,而不是严格的正方形。但其做法与snake是一样的。

    在snake进行递推的时候,我们要考虑的是snake的边界问题,既控制本次循环你的起点在哪里,终点在哪里,依次递推直到所有的snake都填充完毕,也就是snake最后一位就是 n×mn\times m

    代码层面上,我们可以定义一个表示当前snake值的数times,times等于多少就代表当前snake。之后定义四个控制边界的变量,设为x1,x2,y1,y2。在每次循环的时候,我们经过一次行和列需要对相应的值进行处理,比如经过最上面的边,其上边界就要+1,经过最右边的边,其右边界就要-1,依次递推得到左边界和下边界的关系。就这样一直循环,直到times的值大于 n×mn\times m 了,就代表times已经把 n×mn\times m 的值都赋值了,也就是snake结束了。

    像做这种模拟题的时候耐下心分析模拟题的本质是最重要的,不管是正着推还是反着推,都要找到模拟的步骤,看看能否通过简单的模拟方法去实现这个问题。如同模拟一样,打A也是一个漫长的过程,但打A所带来的收获也是巨大的。小了说可以给你带来综测的加分、单项奖学金的评比,大了说就是解决问题的思维与方法。

    #include<stdio.h>
    ​
    int num[1005][1005];
    ​
    int main() 
    {
        int n,m;
        scanf("%d %d",&n,&m);
        int times = 1;
        int n1 = 1;
        int n2 = m;
        int y1 = 1;
        int y2 = n;
        if(n == 1 && m == 1)
        {
            printf("1\n");
            return 0;
        }
        while(times < n*m)
        {
            for(int i = n1; i <= n2; i++)
            {
                num[y1][i] = times++;
            }
            y1++;
            if(times > n*m)
            break;
            for(int i = y1; i <= y2; i++)
            {
                num[i][n2] = times++;
            }
            n2--;
            if(times > n*m)
            break;
            for(int i = n2; i >= n1; i--)
            {
                num[y2][i] = times++;
            }
            y2--;
            if(times > n*m)
            break;
            for(int i = y2; i >= y1; i--)
            {
                num[i][n1] = times++;
            }
            n1++;
            if(times > n*m)
            break;
        }
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= m; j++)
            {
                printf("%d ",num[i][j]);
            }
            printf("\n");
        }
    }
    
    • 1

    信息

    ID
    1007
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    106
    已通过
    23
    上传者