题目背景
UPDATE:T1 可能评测机有问题,50的程序可能是对的。结束后排查问题后会进行修正
借助反作弊系统,一些在月赛有抄袭作弊行为的选手被抓出来了!
题目描述
现有 2^n\times 2^n (n\le10)2n×2n(n≤10) 名作弊者站成一个正方形方阵等候 kkksc03 的发落。kkksc03 决定赦免一些作弊者。他将正方形矩阵均分为 4 个更小的正方形矩阵,每个更小的矩阵的边长是原矩阵的一半。其中左上角那一个矩阵的所有作弊者都将得到赦免,剩下 3 个小矩阵中,每一个矩阵继续分为 4 个更小的矩阵,然后通过同样的方式赦免作弊者……直到矩阵无法再分下去为止。所有没有被赦免的作弊者都将被处以棕名处罚。
给出 nn,请输出每名作弊者的命运,其中 0 代表被赦免,1 代表不被赦免。
输入输出格式
输入格式:
一个整数 n。
输出格式:
2^n \times 2^n2n×2n 的 01 矩阵,代表每个人是否被赦免。数字之间有一个空格。
输入输出样例
输入样例#1
3
输出样例#1
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
思路
爆搜即可,其实和那个无限分割的三角形有点像,反正n<10。
#include <stdio.h>
#include <iostream>
using namespace std;
int n,s,a[1024][1024];
void dfs(int i,int x,int y)
{
if(i==1) return;
register int j,k;
for(j=x;j<x+(i/2);j++)//在左上角的矩阵开始赦免
{
for(k=y;k<y+(i/2);k++)
{
a[j][k]=0;
}
}
dfs(i/2,x+(i/2),y);
dfs(i/2,x,y+(i/2));
dfs(i/2,x+(i/2),y+(i/2));
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
register int i,j;
cin>>n;
n=(1<<n);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
a[i][j]=1;
}
}
dfs(n,1,1);
for(i=1;i<=n;i++,cout<<endl)
{
for(j=1;j<=n;j++)
{
cout<<a[i][j]<<' ';
}
}
return 0;
}