zoukankan      html  css  js  c++  java
  • 【递归】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;
    }
    

    题解视频

    链接

    不积硅步,无以至千里。
  • 相关阅读:
    【面积并】 Atlantis
    【动态前k大 贪心】 Gone Fishing
    【复杂枚举】 library
    【双端队列bfs 网格图建图】拯救大兵瑞恩
    【奇偶传递关系 边带权】 奇偶游戏
    【权值并查集】 supermarket
    CF w4d3 A. Pythagorean Theorem II
    CF w4d2 C. Purification
    CF w4d2 B. Road Construction
    CF w4d2 A. Cakeminator
  • 原文地址:https://www.cnblogs.com/wyloving/p/14033330.html
Copyright © 2011-2022 走看看