题解:
#include<iostream>
#include<math.h>
using namespace std;
void PT(int n)//输出n个空格
{
for(int i=0;i<n;i++)
cout<<" ";
}
void F(int n,int L,int flag)//n为度数,L为层数,flag为1代表左边(要填充),flag为0代表右边
{
if(n==1)
cout<<'X';
else
{
if(L<=pow(3,n-2))
{
if(flag)
F(n-1,L,flag);
else
F(n-1,L,!flag);
PT(pow(3,n-2));
F(n-1,L,flag);
}
else if(L<=2*pow(3,n-2))
{
PT(pow(3,n-2));
F(n-1,L%(int)(pow(3,n-2)),flag);
PT(pow(3,n-2));
}
else
{
if(flag)
F(n-1,L%(int)(pow(3,n-2)),flag);
else
F(n-1,L%(int)(pow(3,n-2)),!flag);
PT(pow(3,n-2));
F(n-1,L%(int)(pow(3,n-2)),flag);
}
}
}
void Solve(int n)
{
if(n==1)
{
cout<<'X'<<endl;
return ;
}
for(int i=1;i<=pow(3,n-2);i++)
{
F(n-1,i,1);
PT(pow(3,n-2));
F(n-1,i,0);
cout<<endl;
}
for(int i=1;i<=pow(3,n-2);i++)
{
PT(pow(3,n-2));
F(n-1,i,0);
PT(pow(3,n-2));
cout<<endl;
}
for(int i=1;i<=pow(3,n-2);i++)
{
F(n-1,i,1);
PT(pow(3,n-2));
F(n-1,i,0);
cout<<endl;
}
}
int main()
{
int n;
cin>>n;
while(n!=-1)
{
Solve(n);
cout<<'-'<<endl;
cin>>n;
}
return 0;
}
我的代码:
#include <bits/stdc++.h>
using namespace std;
#define pr for(int i = 1;i <= pow(3,n - 2);i++) cout << ' ';
void dfs(int n,int l,int flag)
{
if(n==1) cout << 'X';
else
{
if(l <= pow(3,n - 2))
{
if(flag) dfs(n - 1,l,flag);
else
{
dfs(n - 1,l,!flag);
pr;
dfs(n - 1,l,flag);
}
}
else if(l <= 2 * pow(3,n - 2))
{
pr;
dfs(n - 1,l % (int)(pow(3,n - 2)),flag);
pr;
}
else
{
if(flag) dfs(n - 1,l % (int)(pow(3,n - 2)),flag);
else dfs(n - 1,l % (int)(pow(3,n - 2)),!flag);
pr;
dfs(n - 1,l % (int)(pow(3,n - 2)),flag);
}
}
}
int main()
{
int n;
while(cin>>n)
{
if(n==1) cout << 'X' << endl;
else
{
for(int i = 1;i <= pow(3,n - 2);i++)
{
dfs(n - 1,i,1);
pr;
dfs(n - 1,i,0);
puts("");
}
for(int i = 1;i <= pow(3,n - 2);i++)
{
pr;
dfs(n - 1,i,0);
pr;
puts("");
}
for(int i = 1;i <= pow(3,n - 2);i++)
{
dfs(n - 1,i,1);
pr;
dfs(n - 1,i,0);
puts("");
}
}
cout << "-\n";
}
}
```