FZU--1859&POJ--2083|(分治法)

Fractal

Time Limit: 1000MS   Memory Limit: 30000KB   64bit IO Format: %I64d & %I64u

Submit Status

Description

A fractal is an object or quantity that displays self-similarity, in a somewhat technical sense, on all scales. The object need not exhibit exactly the same structure at all scales, but the same "type" of structures must appear on all scales.

A box fractal is defined as below :

  • A box fractal of degree 1 is simply

    X

  • A box fractal of degree 2 is 

    X X

    X

    X X

  • If using B(n - 1) to represent the box fractal of degree n - 1, then a box fractal of degree n is defined recursively as following 
    B(n - 1)        B(n - 1)
    
     B(n - 1)
    
    B(n - 1)        B(n - 1)

Your task is to draw a box fractal of degree n.

Input

The input consists of several test cases. Each line of the input contains a positive integer n which is no greater than 7. The last line of input is a negative integer ?1 indicating the end of input.

Output

For each test case, output the box fractal using the ‘X‘ notation. Please notice that ‘X‘ is an uppercase letter. Print a line with only a single dash after each test case.

Sample Input

1
2
3
4
-1

Sample Output

X
-
X X
 X
X X
-
X X   X X
 X     X
X X   X X
   X X
    X
   X X
X X   X X
 X     X
X X   X X
-
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X
   X X               X X
    X                 X
   X X               X X
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X
         X X   X X
          X     X
         X X   X X
            X X
             X
            X X
         X X   X X
          X     X
         X X   X X
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X
   X X               X X
    X                 X
   X X               X X
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X

分治法画图

代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
#include<cstring>
#include<algorithm>
#define mem(a,b) memset(a,b,_sizeof(a))
using namespace std;

typedef long long ll;
typedef unsigned long long llu;
const int maxd=1000+10;
//---------------------
int n;
char mz[maxd][maxd];
int _size[8];

void init(int len)
{
    for(int i=0; i<len; ++i)
      {
          for(int j=0; j<len; ++j)
            mz[i][j]=' ';
        mz[i][len]='\0';
      }
}

void draw(int n,int x,int y)
{
    if(n==1)
        mz[x][y]='X';
    else
    {
        draw(n-1,x,y);
        draw(n-1,x,y+_size[n-1]*2);
        draw(n-1,x+_size[n-1],y+_size[n-1]);
        draw(n-1,x+_size[n-1]*2,y);
        draw(n-1,x+_size[n-1]*2,y+_size[n-1]*2);
    }
    return;
}

int main()
{
    freopen("1.txt","r",stdin);
    _size[0]=0;
    _size[1]=1;
    for(int i=2; i<=9; ++i)
        _size[i]=_size[i-1]*3;
    while(scanf("%d",&n)==1 && n!=-1)
    {
        init(_size[n]);
        draw(n,0,0);
        for(int i=0; i<_size[n]; ++i)
        {
            for(int j=0; j<_size[n]; ++j)
                printf("%c",mz[i][j]);
            printf("\n");
        }
        printf("-\n");
    }
    return 0;
}

Fractal II

Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u

Submit Status

Description

A fractal is an object or quantity that displays self-similarity, in a somewhat technical sense, on all scales. The object need not exhibit exactly the same structure at all scales, but the same "type" of structures must appear on all scales.

A Sierpinski fractal is defined as below:

  • A Sierpinski fractal of degree 1 is simply

    @
  • A Sierpinski fractal of degree 2 is

    @@@
  • If using B(n-1) to represent the Sierpinski fractal of degree n-1, then a Sierpinski fractal of degree n is defined recursively as following

    B(n-1)B(n-1)B(n-1)

    Your task is to draw a Sierpinski fractal of degree n.

  • Input

    The input consists of several test cases. Each line of the input contains a positive integer n which is no greater than 10. The last line of input is an integer 0 indicating the end of input.

    Output

    For each test case, output the Sierpinski fractal using the ‘@‘ notation. Print a blank line after each test case. Don‘t output any trailing spaces at the end of each line, or you may get a PE!

    Sample Input

    120

    Sample Output

    @@@@

    用已知的图形拼凑出现有的图形,用分治法,注意格式控制;

    代码:

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<map>
    #include<cstring>
    #include<algorithm>
    #define mem(a,b) memset(a,b,_sizeof(a))
    using namespace std;
    
    typedef long long ll;
    typedef unsigned long long llu;
    const int maxd=2000+10;
    //---------------------
    int n;
    char mz[maxd][maxd];
    int _size[12];
    
    void init(int len)
    {
        for(int i=0; i<len; ++i)
          {
              for(int j=0; j<len; ++j)
                mz[i][j]=' ';
            mz[i][len]='\0';
          }
    }
    
    void draw(int n,int x,int y)
    {
        if(n==1)
            mz[x][y]='@';
        else
        {
            draw(n-1,x,y);
            draw(n-1,x+_size[n-1],y);
            draw(n-1,x+_size[n-1],y+_size[n-1]);
        }
        return;
    }
    
    int main()
    {
        freopen("1.txt","r",stdin);
        _size[0]=0;
        _size[1]=1;
        for(int i=2; i<=12; ++i)
            _size[i]=_size[i-1]*2;
        while(scanf("%d",&n)==1 && n)
        {
            init(_size[n]);
            draw(n,0,0);
            for(int i=0; i<_size[n]; ++i)
            {
                for(int j=_size[n]-1; j>=0; --j)
                if(mz[i][j]=='@') {mz[i][j+1]='\0';break;}
               puts(mz[i]);
            }
            printf("\n");
        }
        return 0;
    }
    
    时间: 2024-11-07 06:24:21

    FZU--1859&POJ--2083|(分治法)的相关文章

    ACM/ICPC算法训练 之 分治法入门(画图模拟:POJ 2083)

    题意:大致就是要求画出这个有规律的Fractal图形了= = 例如 1 对应 X 2 对应 X  X   X    X  X 这个题是个理解分治法很典型的例子(详情请参见Code) 分治法:不断缩小规模,以致把整个大问题分解为若干个可以直接处理的小问题,一般通过递归调用实现,可以用极简代码完成高复杂的工作,但空间与时间占用也相对较大. 1 //分治法画图 2 //Memory:880K Time:16 Ms 3 #include<iostream> 4 #include<cstring&

    poj 3714 Raid 分治法求平面最近点对

    题意: 给平面上的n个点,求两点间的最短距离. 分析: 分治法,保存点用vector会tle... 代码: //poj 3714 //sep9 #include <iostream> #include <algorithm> #include <cmath> using namespace std; const double INF=1e50; struct P { double x,y; int type; }p[240000],b[240000]; bool cmp

    专题:分治法

    分治法(Divide and Conquer) 作为五大算法之一的分治法,可算是最早接触的一种算法.分治法,与其说是一种算法,不如将其称为策略来的更贴切一些.算法的思想就是将大问题分成小问题,并解决小问题之后合并起来生成大问题的解. 分治法的精髓: 分--将问题分解为规模更小的子问题: 治--将这些规模更小的子问题逐个击破: 合--将已解决的子问题合并,最终得出“母”问题的解: 分治法的作用,自然是让程序更加快速地处理问题.比如一个n的问题分解成两个n/2的问题,并由两个人来完成,效率就会快一些

    分治法(一)

    这篇文章将讨论: 1) 分治策略的思想和理论 2) 几个分治策略的例子:合并排序,快速排序,折半查找,二叉遍历树及其相关特性. 说明:这几个例子在前面都写过了,这里又拿出来,从算法设计的策略的角度把它们放在一起来比较,看看分治是如何实现滴.由于内容太多,我将再花一篇文章来写4个之前没有写过的分治算法:1,大整数乘法   2,矩阵乘法的分治策略   3,最近点对  4,凸包问题,请见下一篇. 好了,切入正题. --------------------------------------------

    分治法

    分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同.递归的解这些子问题,然后将各子问题的解合并得到原问题的解. 分治法所能解决的问题一般具有以下几个特征: 1) 该问题的规模缩小到一定的程度就可以容易地解决 2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质. 3) 利用该问题分解出的子问题的解可以合并为该问题的解: 4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题. 分治法的基本步骤:分治法在

    算法实验:分治法合并排序(C++)

    这篇文章分两部分来写,第一部分写代码的实现过程,第二部分把实验报告从头到尾呈现出来. 我习惯调试使用的编译器是DEV C++,不是vs系列的,可能头文件上有点区别.但是下面的报告是我放到vs里面测试过的,可以直接用,不影响. 第一部分:(解析) 题目:随机产生一个整型数组,然后用合并排序将该数组做升序排列,要求输出排序前和排序后的数组. 题目分析: 需要随机产生一个整数数组: 采用的算法是合并排序,也就是用归并排序: 输出排序后的数组. 随机产生一个整数数组:这个问题首先想到的是用rand()函

    分治法与递归编程步骤

    分治法是一种很强大的算法设计方法.基本思想是:将原问题分解为几个规模小但类似于原问题的子问题,递归的求解这些子问题,然后再合并这些子问题的解来建立原问题的解. 在分治策略中,递归地求解一个问题,在每层递归中应用如下三个步骤: (1)分解(Divide):将原问题分解为一些子问题,子问题的形式与原问题一样,只是规模更小. (2)解决(Conquer):递归地解出子问题.如果子问题规模足够小,则停止递归,直接求解. (3)合并(Combine):将子问题的解组合成原问题的解. 分治思想体现在编码上,

    分治法 求 逆序对数 的个数 时间复杂度为O(n*logn)

    思路: 分治法 归并排序的过程中,有一步是从左右两个数组中,每次都取出小的那个元素放到tmp[]数组中 右边的数组其实就是原数组中位于右侧的元素.当不取左侧的元素而取右侧的元素时,说明左侧剩下的元素均比右侧的第一个元素大,即均能构成一个逆序对.假设现在左侧剩余n个元素,则逆序对数+n. 另外,如果当所有右侧的元素都取完,但是左侧仍然有元素剩余时,左侧剩余的元素已经在之前的运算中加到了逆序对中,不需要再添加一次 下面给出 归并排序 和 求逆序对数 两份代码: code1: 归并排序 #includ

    《github一天一道算法题》:分治法求数组最大连续子序列和

    看书.思考.写代码! /*************************************** * [email protected] * blog: http://blog.csdn.net/hustyangju * 题目:分治法求数组最大连续子序列和 * 思路:分解成子问题+合并答案 * 时间复杂度:O(n lgn) * 空间复杂度:O(1) ***************************************/ #include <iostream> using nam

    分治法-汉诺塔问题

    一 基本概念 分治法,顾名思义分而治之的意思,就是把一个复杂的问题分成两个或很多其它的同样或相似的子问题,再把子问题分成更小的子问题--直到最后子问题能够简单的直接求解,原问题的解即子问题的解的合并. 二基本思想及策略 分治法的设计思想是:将一个难以直接解决的大问题,切割成一些规模较小的同样问题,以便各个击破,分而治之. 分治策略是:对于一个规模为n的问题,若该问题能够easy地解决(比方说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式同样,递归地解