您的位置:首页 > 其它

算法竞赛宝典 递归算法 打印图形

2018-03-26 17:36 99 查看
//打印图形1//找对应坐标的规律时要从整体的指数变化来看,
//不能单纯的只看到两个点之间的关系

#include<iostream>
#include<bits/stdc++.h>

using namespace std;
bool mp[1000][1000]={0};

void print(int n)
{
int p=pow(3.0,n-1);
for(int i=1; i<=p; i++)
{
for(int j=1; j<=p; j++)
{
if(mp[i][j]==1)
printf("X");
else
printf(" ");
}
printf("\n");
}
}
void dfs(int x,int y,int k)
{
if(k==1)
{
mp[x][y]=1;
return ;
}
int p=pow(3,k-2);
dfs(x,y,k-1);
dfs(x,y+2*p,k-1);
dfs(x+p,y+p,k-1);
dfs(x+p*2,y,k-1);
dfs(x+2*p,y+2*p,k-1);
}
int main()
{
int n;
while(cin>>n)
{
dfs(1,1,n);
print(n);
}
return 0;
}

//打印图形2//一种分治的思想
//整体出发

#include<iostream>
#include<bits/stdc++.h>
using namespace std;

char mo[10][10];
char mp[3000+10][3000+10];
int n,m;

void print()
{
int p=pow(n,m);
for(int i=1; i<=p; i++)
{
for(int j=1; j<=p; j++)
{
printf("%c",mp[i][j]);
}
printf("\n");
}
}
void dfs(int x,int y,int k)
{
if(k==1)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
mp[i+x][j+y]=mo[i][j];
}
}
return ;
}
int p=pow(n,k-1);
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(mo[i][j]!=' ')
{
dfs(i*p+x,j*p+y,k-1);
}
}
}
}
int main()
{
while(cin>>n)
{
getchar();
for(int i=0; i<n; i++)
gets(mo[i]);
cin>>m;
dfs(1,1,m);
print();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: