CSP初赛复习-32-完善程序-递归

完善程序

(矩阵变幻)有一个奇幻的矩阵,在不停的变幻,其变幻方式为

数字 0变成矩阵

0 0 
0 1

数字 1变成矩阵

1 1
1 0

最初该矩阵只有一个元素0,变幻n次后,矩阵会变成什么样?

例如,矩阵最初为

0

矩阵变幻 1次后

0 0 
0 1

矩阵变幻 2 次后

0 0 0 0
0 1 0 1
0 0 1 1
0 1 1 0

输入一行一个不超过 10的正整数n

输出变幻n次后的矩阵

试补全程序

提示

<< 表示二进制左移运算符,例如 \((11)_2\) $ <<2=(1100)_2 $

^ 表示二进制异或运算符,它将两个参与运算的数中的每个对应的二进制位—进行比较,若两个二进制位相同,则运算结果的对应二进制位为 0 ,反之为 1

#include <cstdio>
using namespace std;
int n;
const int max_size = 1 << 10;//定义整形常量 左移10位 2^10=1024

int res[max_size][max_size];//二维数组
/*
  x y 矩阵中的坐标
  n第几层 
  本层4个位置的初始数字
*/
void recursive(int x, int y, int n, int t) {
    if (n == 0) {//递归到n=0时结束
        res[x][y] = ①;//赋值当前位置状态
        return;
    }
    int step = 1 << (n - 1);//每次左右分成2份 上下分成2份 当前相对应当的位置
    recursive(②, n - 1, t);//左上 x,y
    recursive(x, y + step, n - 1, t);//左下 x,y+step
    recursive(x + step, y, n - 1, t);//右上 x+step,y
    recursive(③, n - 1, !t);//右下x+step,y+step
}

int main() {
    scanf("%d", &n);//n次转换
    recursive(0, 0, ④);//n次转换 从0开始
    int size = ⑤;//二维矩阵一维的长度 一维度长度每次增加一倍 增加n次 所以1<<n
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++)
            printf("%d", res[i][j]);
        puts("");
    }
    return 0;
}

分析

n=1时
step=1
左上 recursive(0,0,0,0) =0
左下 recursive(0,1,0,0) =0
右上 recursive(1,0,0,0) =0
右下 recursive(1,1,0,0) =1

具体数据
0 0 
0 1

n=2时
step=2 
左上 recursive(0,0,1,0)
对应
    左上 recursive(0,0,0,0) =0
    左下 recursive(0,1,0,0) =0
    右上 recursive(1,0,0,0) =0
    右下 recursive(1,1,0,0) =1
左下 recursive(0,2,1,0)
    左上 recursive(0,2,0,0) =0
    左下 recursive(0,3,0,0) =0
    右上 recursive(1,2,0,0) =0
    右下 recursive(1,3,0,0) =1
右上 recursive(2,0,1,0)
    左上 recursive(2,0,0,0) =0
    左下 recursive(2,1,0,0) =0
    右上 recursive(3,0,0,0) =0
    右下 recursive(3,1,0,0) =1
右下 recursive(2,2,1,1)
    左上 recursive(2,2,0,1) =1
    左下 recursive(2,3,0,1) =1
    右上 recursive(3,2,0,1) =1
    右下 recursive(3,3,0,1) =0
具体数据
0 0 0 0
0 1 0 1
0 0 1 1
0 1 1 0

①处应填()
A n%2
B 0
C t
D 1

答案 C

赋值当前状态t,某坐标位置和坐标在4个位置中的具体那个位置和变换次数2个因素有关
1次递归
0 0 
0 1
左上0  左下0 右上0 右下1

2次递归,如下图
0 0 0 0
0 1 0 1
0 0 1 1
0 1 1 0

第1次,把如下16个数字分成4部分
左上,左下,右上t都为0
右下 t为1

如果右下再进行递归,则t为1
左上,左下,右上t都为1
左下t为0
如下图
1 1 
1 0

②处应填()
A x-step , y-step
B x , y-step
C x-step , y
D x , y

答案 D

左上作为参考点x,y ,左下 x,y+step,右上 x+step,y 右下 x+step,y+step 
左下 x,y+step,右上 x+step,y已经给出
左上为x,y 右下为x+step,y+step
当n=1时,和如下数据符合
0 0 
0 1

③处应填()
A x-step , y-step
B x+step , y+step
C x-step , y
D x , y-step

答案 B

答案通第2题

④处应填()
A n-1 , n%2
B n , 0
C n , n%2
D n-1 , 0

答案 B

调用递归函数
从坐标(0,0)开始进行n轮转换,初始状态赋值为0

⑤处应填()
A 1 << (n+1)
B 1 << n
C n+1
D 1<< (n-1)

答案 B

二维矩阵一维的长度 一维度长度每次增加一倍 增加n次 所以1<<n
posted @ 2023-09-12 22:56  new-code  阅读(75)  评论(0)    收藏  举报