- /*
- 例题一:
- 分形是存在"自相似"的一个物体或一种量,从某种技术角度来说,这种"自相似"是全方位的。
- 盒型分形定义如下:
- 度数为1的分形为:
- X
- 度数为2的分形为:
- X X
- X
- X X
- 如果用B(n-1)代表度数为n-1的盒型分形,则度数为n的盒型分形可以递归的定义为:
- B(n-1) B(n-1)
- B(n-1)
- B(n-1) B(n-1)
- 你的任务是输出度数为n的盒型分形。
- 输入描述:
- 输入文件包含多个测试数据,每个测试数据占一行,包含一个正整数n,(n<=7)。输入文件的最后一行为-1,表示结束。
- 输出描述:
- 对每个测试数据,用X表示输出的盒型,每个测试数据对应的输出结果后输入一串"----------",每行的末尾不要输出任何多余的空格,否则得到的是格式错误的结果。
- 分析:
- 输入n,要把n-1的输出作为其一个角进行输出 如输入一个2,
- 要把1的输出最为其一部分 ,构成一个大‘x’,图形输出的函数规律是:第一个3^0,第二个3^1....
- */
- #include<iostream>
- using namespace std;
- int Mypow(int x,int y); //x的y次方
- void setFractl(char a[][1000], int startX, int startY, int n); //递归函数
- int main()
- {
- int n,i,j;
- char a[1000][1000];
- while (1)
- {
- cin>>n;
- if (n == -1)
- {
- break;
- }
- int measure = Mypow(3, n - 1); //图形输出的行数
- setFractl(a,0,0,n); //递归
- for (i = 0; i < measure; i++)
- {
- int max = 0;
- for (j = 0; j < measure; j++) //找到每行最后一个X
- {
- if (a[i][j] == 'X')
- {
- max = j;
- }
- }
- for (j = 0; j < max; j++) //非X位置为空格
- {
- if (a[i][j] != 'X')
- {
- a[i][j] = ' ';
- }
- }
- a[i][max+1] = 'o'; //每行加个'o'作为结束标志
- }
- //输出图形
- for (i = 0; i < measure; i++)
- {
- for (j = 0; j < measure; j++)
- {
- if (a[i][j] != 'o')
- {
- cout<<a[i][j];
- }
- else
- {
- break;
- }
- }
- cout<<endl;
- }
- cout<<"------------------------------------------"<<endl;
- }
- system("pause");
- return 0;
- }
- ///////////////////////////////////////////
- //函数功能:从(startX,startY)位置开始设置度数为n的盒形分形
- //即对盒型分形中的每个X,在字符数组Frac的相应位置设置字符“X”
- void setFractl(char a[][1000], int startX, int startY, int n)
- {
- if (n == 1) //递归结束条件
- {
- a[startX][startY] = 'X';
- }
- else //递归的规律
- {
- int L0 = Mypow(3, n - 2); //x的偏移量
- setFractl(a,startX+0,startY+0,n-1); //起点位置
- setFractl(a,startX+2*L0,startY+0,n-1); //最后一行第一列
- setFractl(a,startX+L0,startY+L0,n-1); //中间一个x
- setFractl(a,startX+0,startY+2*L0,n-1); //第一行最后一个x
- setFractl(a,startX+2*L0,startY+2*L0,n-1); //最后一行最后一列x
- }
- }
- ///////////////////////////////////////////
- int Mypow(int x,int y)
- {
- int sum = 1;
- for (int i=0; i<y; i++)
- {
- sum = sum*x;
- }
- return sum;
- }
- //该片段来自于http://www.codesnippet.cn/detail/251220138233.html
来源: http://www.codesnippet.cn/detail/251220138233.html