ABC357-C题解

最近一直掉分,谔谔。

分析

发现机房里面除了我以外都用递归写的,那我就来讲一种非递归的吧。

考虑第 \(i\) 级地毯拆成九块以后其实就是八块第 \(i-1\) 级地毯与一块大小为 \(3^{i-1}\times 3^{i-1}\) 大小的白色地毯。所以用一个三维数组记录每一级地毯的状态,然后循环往上跑,每一级地毯用上一级地毯来更新,就结束了。

代码虽然有点长,但是基本都是复制粘贴的操作写完的,很好懂。

Code

#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
inline int read()
{
int w=1,s=0;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') w=-1;ch=getchar();}
while(isdigit(ch)){s=s*10+(ch-'0');ch=getchar();}
return w*s;
}
const int maxn=1e6+10;
int n;
int a[10][4000][4000];
void work(int x)
{
	for(int k=0;k<3;k++)
	{
		for(int i=1;i<=pow(3,x-1);i++)
		{
			for(int j=1;j<=pow(3,x-1);j++)
			{
				a[x][i][k*(int)pow(3,x-1)+j]=a[x-1][i][j];
			}
		}
	}
	for(int i=1;i<=pow(3,x-1);i++)
		{
			for(int j=1;j<=pow(3,x-1);j++)
			{
				a[x][(int)pow(3,x-1)+i][j]=a[x-1][i][j];
			}
		}
	for(int i=1;i<=pow(3,x-1);i++)
		{
			for(int j=1;j<=pow(3,x-1);j++)
			{
				a[x][(int)pow(3,x-1)+i][(int)pow(3,x-1)+j]=0;
			}
		}
	for(int i=1;i<=pow(3,x-1);i++)
		{
			for(int j=1;j<=pow(3,x-1);j++)
			{
				a[x][(int)pow(3,x-1)+i][2*(int)pow(3,x-1)+j]=a[x-1][i][j];
			}
		}
	for(int k=0;k<3;k++)
	{
		for(int i=1;i<=pow(3,x-1);i++)
		{
			for(int j=1;j<=pow(3,x-1);j++)
			{
				a[x][2*(int)pow(3,x-1)+i][k*(int)pow(3,x-1)+j]=a[x-1][i][j];
			}
		}
	}
}
signed main()
{
	cin>>n;
	a[0][1][1]=1;
	for(int i=1;i<=n;i++)
	{
		work(i);
	}
//	cout<<a[1][2][2];
	for(int i=1;i<=pow(3,n);i++)
	{
		for(int j=1;j<=pow(3,n);j++)
		{
			cout<<(a[n][i][j]==0?'.':'#');
		}
		cout<<endl;
	}
	return 0;
}


posted @ 2024-07-17 16:55  Redamancy_Lydic  阅读(4)  评论(0编辑  收藏  举报