题解 P1498 【南蛮图腾】

Froggy

2018-10-22 16:28:45

题解

用分治很简单. 每次向下复制一下,向右复制一下,再向上复制一下.

   /\
  /__\
 /\  /\
/__\/__\

向下和向右:(顺便把原本的清掉)


   /\      /\
  /__\    /__\
 /\  /\  /\  /\
/__\/__\/__\/__\

再向上:

       /\
      /__\
     /\  /\
    /__\/__\
   /\      /\
  /__\    /__\
 /\  /\  /\  /\
/__\/__\/__\/__\

OK

上代码
#include<iostream>
#include<cstring>
using namespace std;
int n;
char a[3000][3000];//开大点 
int h=2,w=4;//h是高,w是宽
int main(){
    cin>>n;
    memset(a,' ',sizeof(a));//别被坑了!!! 
    a[1][1]=a[1][4]=' ';
    a[1][2]=a[2][1]='/';
    a[1][3]=a[2][4]='\\';//向右的划线有特殊的含义
    a[2][2]=a[2][3]='_';
    for(int i=1;i<n;i++){
        //向下和向右
        for(int j=1;j<=h;j++){
            for(int k=1;k<=w;k++){
                a[j+h][k]=a[j+h][k+w]=a[j][k];
                a[j][k]=' ';//把上面的清掉
            }
        }
        //向上
        for(int j=1;j<=h;j++){
            for(int k=1;k<=w;k++){
                a[j][k+w/2]=a[j+h][k];
            }
        }
        w*=2,h*=2;
        //刷新完成一次
    }
    for(int i=1;i<=h;i++){
        for(int j=1;j<=w;j++){
            cout<<a[i][j];
        }
        cout<<endl;
    }
    return 0;
}