• 【递归】P5461赦免战俘


    题目相关

    原题链接:P5461 赦免战俘 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

    题目背景

    借助反作弊系统,一些在月赛有抄袭作弊行为的选手被抓出来了!

    题目描述

    现有 (2^n imes 2^n (nle10)) 名作弊者站成一个正方形方阵等候 kkksc03 的发落。kkksc03 决定赦免一些作弊者。他将正方形矩阵均分为 4 个更小的正方形矩阵,每个更小的矩阵的边长是原矩阵的一半。其中左上角那一个矩阵的所有作弊者都将得到赦免,剩下 3 个小矩阵中,每一个矩阵继续分为 4 个更小的矩阵,然后通过同样的方式赦免作弊者……直到矩阵无法再分下去为止。所有没有被赦免的作弊者都将被处以棕名处罚。

    给出 n,请输出每名作弊者的命运,其中 0 代表被赦免,1 代表不被赦免。

    输入格式

    一个整数 n。

    输出格式

    (2^n imes 2^n)的 01 矩阵,代表每个人是否被赦免。数字之间有一个空格。

    输入输出样例

    输入

    3

    输出

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

    分析

    阅读完题目可以发现,题目中已经给出了具体的赦免方案。将正方形矩阵均分为 4 个更小的正方形矩阵,每个更小的矩阵的边长是原矩阵的一半。其中左上角那一个矩阵的所有作弊者都将得到赦免,剩下 3 个小矩阵中,每一个矩阵继续分为 4 个更小的矩阵,然后通过同样的方式赦免作弊者……直到矩阵无法再分下去为止。题目告诉了我们将问题规模缩小的放法,以及终止的条件了。那么,我们就可以使用递归来实现中间的过程。

    难点在于如何描述实现的过程。

    首先,先来描述这个正方形,如何确定一个正方形?当我们知道矩形的四个点的坐标,那么就能确定一个长方形的位置和形状了。也可以通过一个点和边长进行推导。假设左上角的点为(x,y),边长为d。那么我们可以推导出整个矩形的信息.

    image-20201124222829732

    代码实现

    #include<cstdio>
    #include <iostream>
    #include<cmath>
    using namespace std;
    int maps[1030][1030]={0};// 0-不被赦免 1-被赦免 
    /*
    将正方形矩阵均分为 4 个更小的正方形矩阵,
    左上角那一个矩阵的所有作弊者都将得到赦免,
    剩下 3 个小矩阵中,每一个矩阵继续分为 4 个更小的矩阵,
    然后通过同样的方式赦免作弊者
    (x,y)      (x,y+d/2)
    
    (x+d/2,y)  (x+d/2,y+d/2)   
    */ 
    
    void fun(int x,int y,int l){
    	if(l==1){
    		return ;	
    	}
    	
    	//赦免左上的矩阵 (x,y) l/2
    	for(int i=x;i<=x+l/2-1;i++){
    		for(int j=y;j<=y+l/2-1;j++){
    			maps[i][j]=1;
    		}
    	}
    	
    	//同样的方法处理剩下的三个矩阵
    	// (x+l/2,y) l/2
    	fun(x+l/2,y,l/2);
    	// (x,y+l/2)
    	fun(x,y+l/2,l/2);
    	// 
    	fun(x+l/2,y+l/2,l/2);
    }
    
    int main(){
    	int n;
    	cin>>n;
    	int k=pow(2,n);
    	fun(1,1,k);
    	
    	for(int i=1;i<=k;i++){
    		for(int j=1;j<=k;j++){
    			if(maps[i][j]==0){
    				cout<<"1 ";
    			}else{
    				cout<<"0 ";
    			}
    		}
    		cout<<endl;
    	}
    	
    	return 0;
    }
    

    题解视频

    链接

    不积硅步,无以至千里。
  • 相关阅读:
    Go 数组与切片
    Go 常用函数
    Go 函数,包(二)
    函数,包及错误处理
    Go 循环控制
    Go 流程控制
    Go 获取键盘输入,进制转换
    Go 指针,标识符命名规范及关键字
    Go 变量及基本数据类型3
    一文详解微服务架构
  • 原文地址:https://www.cnblogs.com/wyloving/p/14033330.html
Copyright © 2020-2023  润新知