poj2083分圖形-c++ dfs

題目描述

  • 分形(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;
	}
}

有問題請指教

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章