这个题的关键就是如何理解它的x的复位,我们在这里先简述一下递归操作,递归就相当于下楼,而每段函数里写几个递归式说明它有几个楼梯或者说是电梯,通往下一楼。我们要得出当前楼层的东西但我们需要借助下一楼它的东西,但不同于动态规划就是上一楼在之前还没去过,就是每运行,我们是要通过递归的形式模拟下楼,并且运用楼下每一层的东西。
前提说完了就是我对递归的一个理解,然后我们开始这一道题,我们先定义一个大二维数组用于储存'X'的位置,首先我们分析第一个层,'X'只存在于mapp[0][0]直接赋值即可,然后我们分析第二个发现如下图所示
发现了第二层的'X'的赋值操作都在第一层里面完成了,并且我们可以很清楚的得出递归方程。就是每一层都是看下一层的右下,右下下,右右,下下,方位上并且通过,当到达第三层后,'X'的偏移会更大,到达6,第二层是2,所以我们得出了偏移规律就是 与左左的是x+2*pow(3,n-2);与下下的是y+2*pow(3,n-2);与右下的是x+pow(3,n-2),y+pow(3,n-2);与右下下的是x+2*pow(3,n-2),y+2*pow(3,n-2);这就是我们的递归关系。递归代码如下.
void dg(int n,int x,int y)
{
if(n==1)
{
mapp[x][y]='X';
}
else
{
int se=pow(3,n-2);
dg(n-1,x,y);
dg(n-1,x+2*se,y);
dg(n-1,x,y+2*se);
dg(n-1,x+se,y+se);
dg(n-1,x+2*se,y+2*se);
}
}
之后就是简单操作了。本题代码如下
#include<bits/stdc++.h>
using namespace std;
vector<vector<char> >mapp(1000,vector<char>(1000));
void dg(int n,int x,int y)
{
if(n==1)
{
mapp[x][y]='X';
}
else
{
int se=pow(3,n-2);
dg(n-1,x,y);
dg(n-1,x+2*se,y);
dg(n-1,x,y+2*se);
dg(n-1,x+se,y+se);
dg(n-1,x+2*se,y+2*se);
}
}
int main()
{
int x;
while(cin>>x)
{
if(x==-1)break;
int se=pow(3,x-1);
for(int i=0;i<se;i++)
{
for(int i1=0;i1<se;i1++)
{
mapp[i][i1]='0';
}
}
dg(x,0,0);
for(int i=0;i<se;i++)
{
for(int i1=0;i1<se;i1++)
{
cout<<mapp[i][i1];
}
cout<<endl;
}
cout<<'-'<<endl;
}
}