1 条题解

  • 1
    @ 2024-4-27 18:52:45

    【题目大意】

    本题考察模拟法和二维数组,在N×NN×N(NN为奇数)的格子里按一定的规律填数字,直到所有格子都被填上数字时结束,把格子里的数字输出。

    【考纲知识点】

    算法:模拟法(三级)、函数的定义与调用(四级)、二维数组与多维数组基本应用(四级)

    【解题思路】

    本题给出了填数字的具体方法,考虑使用模拟法。

    1. 定义函数f来表示每次填数的过程,二维数组a来储存每个格子的数字。
    2. 输入nn之后以第一行的中间点为f函数的第一组参数,在函数中以x1x1y1y1表示目标格子的位置,判断(x1<1)(x1<1)则回到第nn行,判断(y1>n)(y1>n)则回到第一列。
    3. 确定好x1x1y1y1之后再判断目标位置是否填过,没填过则为0,那就填上原数字+1,再次调用f函数以x1x1y1y1为参数填下一个数字。如果填过了则将目标点改为行数加1的点,越界则回到第一行。再判断目标点的数字是否为0,为0则没有填过,填上原数字+1,调用f函数填下一个数字。若目标点的数字不为0,说明所有格子都填上了数字,结束函数。
    4. 用双层循环把二维数组的数字输出。

    【参考程序】

    #include <bits/stdc++.h>
    using namespace std;
    int n,a[25][25];   
    void f(int x,int y){
        int x1=x-1;     //x1和y1表示要找的下一个位置
        if (x1<1) x1=n;  //越界则回到第n行
        int y1=y+1;
        if (y1>n) y1=1;   //越界则回到第一列
        if (a[x1][y1]==0){  //判断下一个点为0则填a[x][y]的下一个数字
            a[x1][y1]=a[x][y]+1;
            f(x1,y1);  //再次调用f函数,填下一个位置
        }
        else{         //若下一个点不为0,则移动到当前点下方:行数加1,列数不变
            y1=y;         
            x1=x+1;
            if (x1>n) x1=1;   //越界则回到第一行
            if (a[x1][y1]==0){    //若下一个点为0,则填a[x][y]的下一个数字
                a[x1][y1]=a[x][y]+1;  
                f(x1,y1);   //再次调用f函数,填下一个位置
            }
            else return;   //若下一个点不为0,说明所有点都填上了,结束函数
        }
    }
    int main(){
        cin>>n;
        a[1][n/2+1]=1;
        f(1,n/2+1);  //以第一行的中间点为起点,调用模拟函数
        for (int i=1;i<=n;i++){   //填完之后输出二维数组
            for (int j=1;j<=n;j++){
                cout<<a[i][j]<< " ";
            }
            cout<<endl;
        }
        return 0;
    }
    
    • 1

    [GESP样题 四级] 填幻方

    信息

    ID
    638
    时间
    1000ms
    内存
    512MiB
    难度
    3
    标签
    (无)
    递交数
    89
    已通过
    48
    上传者