三角形 | ||||||
| ||||||
Description | ||||||
默认三角形(n=3)是形如下列形状的: * * * * * * * * * n = 4时是这样的 * * * * * * * * * * * * * * * * * * * * * * * * * * * 要求输入一个整数n(3<=n<=9),输入符合题意的图形。 | ||||||
Input | ||||||
多组测试数据,每组一个整数n(3<=n<=9),为一行。 | ||||||
Output | ||||||
输出图形。注意每行后面没有多余空格。 | ||||||
Sample Input | ||||||
3 4 6 | ||||||
Sample Output | ||||||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * | ||||||
Source | ||||||
2014暑假集训练习赛(8月13日) |
解题过程:
n==3的时候图是这样的:
*
* *
* *
* * * *
做分形题第一个要点一定要找到最基础的图形才行,其实这个图算作一个基础图形也可以,但是操作相对会繁杂一点,所以我们可以弄出n==2的时候的图(虽然不需要输出n==2的时候的图)
这个时候我们对于n==3的图进行探究。
其实我们可以利用深搜递归的思想来从最基础也是最顶端的这个最基础的图的三个点递推向下找他们递归到的位子如图:
为了更加突出递归的思想,我们对于n==4的图进行一个顶点的探究:
从中慢慢得出规律,从而得之,我们只要递归一下最基础图(n==2时候的图)的三个点就行了、
初始化的时候我们将输出的数组都初始化为空格,然后等递归完毕之后,从后边向前扫,如果扫到了*,后边加一个‘\0’即可保证没有多余空格的输出。
AC代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
char a[4000][4000];
void dfs(int shendu,int x,int y)
{
a[x][y]='*';
if(shendu==1)return ;
dfs(shendu-1,x,y);
dfs(shendu-1,x+pow(2,shendu-1),y-pow(2,shendu-1));
dfs(shendu-1,x+pow(2,shendu-1),y+pow(2,shendu-1));
}
int main()
{
int n;
while(~scanf("%d",&n))
{
n--;
memset(a,' ',sizeof(a));
dfs(n,1,pow(2,n));
dfs(n,2,pow(2,n)-1);
dfs(n,2,pow(2,n)+1);
for(int i=0;i<pow(2,n)+1;i++)
{
for(int j=pow(2,n+1)+1;j>=0;j--)
{
if(a[i][j]=='*')
{
a[i][j+1]='\0';
break;
}
}
}
for(int i=1;i<pow(2,n)+1;i++)
{
printf("%s\n",a[i]+1);
}
}
}