1 条题解
-
1
【题目大意】
本题考察模拟法和二维数组,在(为奇数)的格子里按一定的规律填数字,直到所有格子都被填上数字时结束,把格子里的数字输出。
【考纲知识点】
算法:模拟法(三级)、函数的定义与调用(四级)、二维数组与多维数组基本应用(四级)
【解题思路】
本题给出了填数字的具体方法,考虑使用模拟法。
- 定义函数f来表示每次填数的过程,二维数组a来储存每个格子的数字。
- 输入之后以第一行的中间点为f函数的第一组参数,在函数中以和表示目标格子的位置,判断则回到第行,判断则回到第一列。
- 确定好和之后再判断目标位置是否填过,没填过则为0,那就填上原数字+1,再次调用f函数以和为参数填下一个数字。如果填过了则将目标点改为行数加1的点,越界则回到第一行。再判断目标点的数字是否为0,为0则没有填过,填上原数字+1,调用f函数填下一个数字。若目标点的数字不为0,说明所有格子都填上了数字,结束函数。
- 用双层循环把二维数组的数字输出。
【参考程序】
#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
信息
- ID
- 638
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 3
- 标签
- (无)
- 递交数
- 89
- 已通过
- 48
- 上传者