模拟 New online oj 1106 蛇形填数

题目

在这里插入图片描述
在这里插入图片描述

翻译

主要思路

观察本题可知,从最后一列开始顺时针填充
在一轮填充(逆时针绕一圈,比如样例里面从1到12)中,有两个关键点

1 填充步幅:

一行或者一列的填充步幅stride最初是n - 1,然后每轮递减2,当填充步幅是0时,说明只用填充1个空格

2 填充起点:

第一轮填充起点是最后一列第一行,然后一次行 + 1,列 - 1

第一次写错误

  1. 一开始居然没想到先存在二维数组里再正常打印二维数组就行了
  2. 太坑了,题目说一次会有多次输入,以为就1个输入

总结

这类题就是找规律
首先找到初始状态(比如第一轮填充步幅是多少),然后研究从一个状态到下一个状态的变化(从第一轮到第二轮填充步幅怎么变化),最后考虑特殊情况(当填充步幅是0该怎么办)

代码

    #include <bits/stdc++.h>
    using namespace std;
    #define MAX_NUM 20
    int Data[MAX_NUM][MAX_NUM];
    int main() {
        int n;
        while(scanf("%d", &n) == 1) {
            int stride = n - 1;
            int count = 1;
            int startCol = n - 1;
            int startRow = 0;
            while(stride >= 0) {
                int row = startRow;
                int col = startCol;
                if(stride == 0) {
                    Data[row][col] = count;
                }
                for(int i = 0; i < stride; i++) Data[row++][col] = count++;
                for(int i = 0; i < stride; i++) Data[row][col--] = count++;
                for(int i = 0; i < stride; i++) Data[row--][col] = count++;
                for(int i = 0; i < stride; i++) Data[row][col++] = count++;
                startRow++;
                startCol--;
                stride -= 2;
            }
            for(int i = 0; i < n; i++) {
                for(int j = 0; j < n; j++) {
                    printf("%d", Data[i][j]);
                    if(j != n - 1) {
                        printf(" ");
                    }
                }
                printf("\n");
            }

        } 
        return 0;
    }
  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值