トピックリンク
まず大きなグラフィックを置く小規模なグラフィックスのための対象は、再帰的に考えなければなりません
グラフィックス場所ダウン、プラス真ん中から周囲にグラフィックスの中間点によって決定することができるよう、あなたが最初に、グラフィックスの中間点を決定する必要があります第二に5つの中間再帰方向分布パターン、4つの境界の再帰的パターンによってここにI再帰的に中立位置
にキーがDATA1とDATA2の長さを見つけることで、再帰的に継続することができる
DATA1は、ゼロ次とみなすことができる3レシピ1は、n-3 3のパワーに加え、電力の3れている
利用可能な対応する結果のパワーオーバーレイ式を用いて
DATA2 3のN-2乗です
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define N 1000
char s[N][N];
void prints(int n,int rowstart,int rowend,
int columnstart,int columnend)
{
if(n == 1&&rowstart == rowend&&columnstart == columnend)
{
s[rowstart][columnstart] = 'o';
}
else
{
int data1 = (int)(pow(3.0,n-2)+0.5)-1;
data1 = data1/2;
//data1利用次方的求和公式求出,+0.5是为了避免pow函数所带来的误差
int data2 = (int)(pow(3.0,n-2)+0.5);
//data2通过n-2次方求出结果
int rowmiddle = (rowstart+rowend)/2;
int columnmiddle = (columnstart+columnend)/2;
prints(n-1,rowmiddle-data1-data2,rowmiddle-data1-1,
columnmiddle-data1,columnmiddle+data1);
//递归出左边图形的起始坐标,终止坐标
prints(n-1,rowmiddle+data1+1,rowmiddle+data1+data2,
columnmiddle-data1,columnmiddle+data1);
//递归出右边图形的起始坐标,终止坐标
prints(n-1,rowmiddle-data1,rowmiddle+data1,
columnmiddle-data1-1,columnmiddle-data1-data2);
//递归出上面图形的起始坐标,终止坐标
prints(n-1,rowmiddle-data1,rowmiddle+data1,
columnmiddle+data1+1,columnmiddle+data1+data2);
//递归出下面图形的起始坐标,终止坐标
prints(n-1,rowmiddle-data1,rowmiddle+data1,
columnmiddle-data1,columnmiddle+data1);
//递归出中间图形的起始坐标,终止坐标
}
}
int main(){
int n1;
scanf("%d",&n1);
for(int u=1;u<=n1;u++)
{
fill(s[0],s[0]+N*N,' ');
int n;
scanf("%d",&n);
int data = (int)(pow(3.0,n-1)+0.5);
int total = (int)(pow(3.0,n-1)+0.5);
int middle = (1+data)/2;
prints(n,1,data,1,data);
printf("Case #%d:\n",n1);
for(int i=1;i<=total;i++)
{
for(int j=1;j<=total;j++)
{
printf("%c",s[i][j]);
if(j == total)
{
printf("\n");
}
}
}
}
return 0;
}