思路:分形题目,同一个操作,一般都用递归
分形题目思路: (1)首先确定一个坐标或多个坐标,视题目而定,这几个坐标是可以确定一个最小或者次小图形的;
(2)一般来说,分形题目都离不开深度(状态)类似的词,所以dfs可以写成dfs(depth,int x,int y ...........),,,省略号时题目而定,一般都是坐标,长度,宽度之类的
(3)分形图形基本都是有规律的,对称的,每一个“深度”(既是状态)都有相应的宽度和长度,通过当前的点的坐标和长度宽度,去确定其他相对应或者相对称图形的坐标,有几个对应的图形当前dfs函数就有几个下一个状态 如这道题有5个小图形,dfs(n-1,....) dfs(n-1,.....) dfs(n-1......) dfs(n-1.......) dfs(n-1.......)
(4)注意递归终点,一般都是深度为1时返回并填充字母。
好了,根据上面的思路,再把下面的代码看懂,以后遇到分形就能立刻有思路了
#include<cstdio>
#include<cstring>
char a[1000][1000];
int mypow(int d)
{
int ans=1;
for(int i=1;i<=d;i++)
ans*=3;
return ans;
}
void dfs(int cur,int x,int y)
{
if(cur==1)
{
a[x][y]='X';
return ;
}
int s=mypow(cur-2);
dfs(cur-1,x,y);
dfs(cur-1,x,y+2*s);
dfs(cur-1,x+s,y+s);
dfs(cur-1,x+2*s,y);
dfs(cur-1,x+2*s,y+2*s);
}
int main(void)
{
int n;
while(scanf("%d",&n))
{
if(n==-1) break;
memset(a,' ',sizeof(a));
dfs(n,1,1);
int s=mypow(n-1);
for(int i=1;i<=s;i++)
a[i][s+1]='\0';
for(int i=1;i<=s;i++)
printf("%s\n",a[i]+1);//在poj测试,put(a[i]+1)用了16ms,而printf("%s")用了94ms
printf("-\n");
}
return 0;
}