题目链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2308
【中文题意】
就是打印出如下图的图像:
2
o
o o
o o
o o o o
3
o
o o
o o
o o o o
o o
o o o o
o o o o
o o o o o o o o
【思路分析】首先一个点的位子是可以确定,那就是第一行的那一个点。
然后可以根据这个点找出下一层的最上面的顶点,然后一次递归,直到处理到值包含三个点的那一层。
【AC代码】
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
char a[3000][3000];
void dfs(int cur,int x,int y)
{
if(cur==1)
{
a[x][y]='o';
a[x+1][y+1]='o';
a[x+1][y-1]='o';
return ;
}
int s=pow(2,cur-1);
dfs(cur-1,x,y);
dfs(cur-1,x+s,y-s);
dfs(cur-1,x+s,y+s);
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
memset(a,' ',sizeof(a));
scanf("%d",&n);
n++;
int x=(int)pow(2,n-1);
//printf("%d\n",x);
dfs(n,1,x);
int y=pow(2,n);
//printf("%d\n",y);
for(int i=1;i<=x;i++)
{
a[i][x+i]='\0';
}
for(int i=1;i<=x;i++)
{
printf("%s\n",a[i]+1);
}
printf("\n");
}
return 0;
}