luogu1498:南蛮图腾:分治?复制!

题目链接:


题意:

1 打印图形,要求打印2的(n-1)次方层的三角形

n=1的时候,输出

n=2的时候,输出

   n=3的时候,输出


解题思路:

1 想来想去没理解和分治有什么关系,只想到了是倍增的思维;

2 很认证研究了半天题解之后发现,原来是分步骤复制的问题,所以叫分治?应该是我没理解透分治,还要多刷题!

3 我用的方法是:打表!

4 设当前是第x层,将x层的图形在 x+1 层复制两份,再回头在x层居中对齐复制一次,具体操作如下图:

当前从第1层复制到第2层:

                                                                                     

本来这样============> 第一步:将自己向下复制两份 ========>第二步:向上(原来层)中间对齐复制一份回去

5 也有一些题解是用逆序存放的方法来解决对齐的问题,也是很流弊的~~~

上代码:

#include<bits/stdc++.h>

char s[2000][2000];

int main()
{
	int n;
	scanf("%d",&n);
	
	memset(s,' ',sizeof(s));
	
	s[1][1]=s[1][4]=' ';
	s[1][2]=s[2][1]='/';
	s[2][2]=s[2][3]='_';
	s[1][3]=s[2][4]='\\';
	
	int h=2,w=4;
	
	for(int i=1;i<n;i++)
	{
		//先向下:复制两个
		for(int x=1;x<=h;x++)
		{
			for(int y=1;y<=w;y++)
			{
				s[x+h][y]=s[x+h][y+w]=s[x][y];
				s[x][y]=' ';//把原来的位置清空 
				
			}
		} 
		//再向上:中间对齐复制回去
		for(int x=1;x<=h;x++)
		{
			for(int y=1;y<=w;y++)
			{
				s[x][y+w/2]=s[x+h][y];
			}
		} 
		h*=2;w*=2;
	}	
	
	for(int i=1;i<=h;i++)
	{
		for(int j=1;j<=w;j++)
		{
			printf("%c",s[i][j]);
		}
		printf("\n");
	}
	
	return 0;
} 

 

 

 

 

 

 

 

 

 

 

 

 

 


版权声明:本文为liusu201601原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。