題目描述
- 分形(Fractal)通常被定義爲“一個粗糙或零碎的幾何形狀,可以分成數個部分,且每一部分都(至少近似地)是整體縮小後的形狀”,即具有自相似的性質。例如一棵蕨類植物,仔細觀察,你會發現,它的每個枝杈都在外形上和整體相同,僅僅在尺寸上小了一些。而枝杈的枝杈也和整體相同,只是變得更加小了。那麼,枝杈的枝杈的枝杈呢?自不必贅述。圖展示了4種類型的分形圖。
圖略
魔法世界的科學家由此提出分形宇宙論,即認爲宇宙本質上是一個粒子。構成宇宙的無數個粒子裏面又會有其他小宇宙。 例如:一個尺度的宇宙表示爲: X 兩個尺度宇宙表示爲 X X X X X 如果用B(n-1) 表示n-1尺度的宇宙,則遞歸定義爲:
B(n-1) B(n-1) B(n-1) B(n-1) B(n-1)
輸入格式
輸入有多組數據,每組一個整數n(n≤7),表示宇宙的尺度,最後一行以-1結束。
輸出格式
每組數據以字母“X”繪出分形圖,每組數據以一個“-”表示結束。
輸入樣例
1
2
3
4
-1
輸出樣例
本題是使用遞歸的方式做,主要是找到每個小部分的起始位置,我借鑑了網上大佬使用二維數組的方法做,之前的做法對於中間空格的把控不太好,然後有一個很重要的點就是,每次遞歸下一個組成部分的時候,x,y是代表着左上角那一個’X’的位置,通過該位置找規律就行,然後找到上下左右五個點的座標規律和3有關其實問題就很好解決,然後使用memset函數
memset 函數是內存賦值函數,用來給某一塊內存空間進行賦值的;
包含在<cstring>頭文件中,可以用它對一片內存空間逐字節進行初始化;
原型爲 : void *memset(void *s, int v, size_t n);
這裏s可以是數組名,也可以是指向某一內在空間的指針;
v爲要填充的值;
n爲要填充的字節數;
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
char map[500][500];
void dfs(int n,int x,int y){
if(n==1){
map[x][y]='X';
return;
}
int m = pow(3,n-2);
//左上
dfs(n-1,x,y);
//右上
dfs(n-1,x+m*2,y);
//中間
dfs(n-1,x+m,y+m);
//右下
dfs(n-1,x+m*2,y+m*2);
//左下
dfs(n-1,x,y+m*2);
}
main()
{
int n;
while(cin>>n&&n!=-1){
memset(map,' ',sizeof(map));
dfs(n,0,0);
for(int i=0;i<pow(3,n-1);i++){
for(int j=0;j<pow(3,n-1);j++){
cout<<map[i][j];
}
cout<<endl;
}
cout<<"-"<<endl;
}
}
有問題請指教