题目相关

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

题目背景

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

题目描述

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

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

输入格式

一个整数 n。

输出格式

\(2^n \times 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。那么我们可以推导出整个矩形的信息.

代码实现

#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;
}

题解视频

链接

最新文章

  1. 运行执行sql文件脚本的例子
  2. 关于aggregation 语法和表达式大全(最新3.4版)
  3. Orchard常见问题
  4. zoj The 12th Zhejiang Provincial Collegiate Programming Contest Beauty of Array
  5. docker articles&amp;videos
  6. Netsharp快速入门(之9) 基础档案(工作区3 添加商品菜单,以及在产品中打开商品界面)
  7. 设置TextView控件的背景透明度和字体透明度
  8. [威客任务]¥800.00 JS实现网站联动三级选项
  9. 深入Java虚拟机读书笔记第三章安全
  10. 开启Mysql慢查询来优化mysql
  11. ajax全局函数运用
  12. 用C++写一个简单的订阅者
  13. POJ 1122 FDNY to the Rescue!
  14. dapper支持oracle游标
  15. 表单提交音乐文件(php)
  16. Java基础3:深入理解String及包装类
  17. Android版本28使用http请求
  18. winform窗体运行时的大小和设计时不一致
  19. Mouse Detected Problem
  20. openshift node资源限制

热门文章

  1. do{}while(false)的用法
  2. Angular学习知识点记录
  3. AOP 有几种实现方式?
  4. double类型和int类型的区别
  5. Linux杂谈: gcc对结构体大小的默认处理方式
  6. 一段小代码秒懂C++右值引用和RVO(返回值优化)的误区
  7. css 09-CSS案例讲解:博雅互动
  8. Cookie注入新方法
  9. 它听键盘声就知道你敲的是什么——GitHub 热点速览 Vol.51
  10. Python 搜索文件,文件过滤,pathlib模块