这两天自学了一线算法导论里分治策略的内容,秉着只有真正投入投入编程,才能更好的理解一种算法的思想的想法,兴致勃勃地找一些入门的题来学习。

搜了一下最后把目光锁定在了Poj fractal这一个题上。以前一直对这种题无从下手,通过对这一条题的分析与理解,算是第一次对分治思想有一个较为具象的了解。

分治思想的依托为递归。

下面我尝试用分支策略的思想描述这一题。

分解:

在这条题里,通过分析题目可以知道:每一个更大一点的图形都是由前一个状态的小图形放置在对应位置组成的;而每一个小图形的又由更前一个状态的图形组成。

因此,我们可以把一开始输入的规模m视为【大问题】,大问题的内容是:如何按照‘X'的形态填充对应位置的字符。

接着,把大问题划分为5个规模为m-1视为【大问题的划分问题1】,问题1 的内容是:如何按照‘X'的形态填充对应位置的字符。

再接着,把问题1的内容划分为更小的5个规模为m-2的【问题1的划分问题2】,问题2 的内容是:如何按照‘X'的形态填充对应位置的字符。

……

终态:当问题被划分为为规模为1 的子问题时,已经不那么再继续划分了。这时候可以直接在当前位置上填一个“X"。

将每一个层次的问题视为一个状态, 相邻状态的关系为【当前问题规模数=前一个问题规模数-1】

解决:

通过观察每一个规模的图形不难发现其中的规律

XXXOOOXXX

XXXOOOXXX

XXXOOOXXX

OOOXXXOOO

OOOXXXOOO

OOOXXXOOO

XXXOOOXXX

XXXOOOXXX

XXXOOOXXX

每一个图形的规模面积为m*m,长与宽正好是规模数m,在左上、右上、中部、左下、右下分别为前一个规模的图形,其他部分为空

而每一个规模为m的图形,某一个部分离相邻一个部分的距离为3^(m-2)【比如左上部分第一个格子的位置距离右上部分第一个格子的距离:纵坐标相同,横坐标为+3^(m-2)】

合并:

以递归的方式合并不断分解问题,局部解决以后又返回上一个状态。

注:因为其他部分为空,所以图形以外的数组部分要填'\0'

具体实现

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
char a[][];
void dfs(int cur,int x,int y)
{
if(cur==)
{
a[x][y]='X';
return ;
}
int s=(int)pow(3.0,cur-);
//分别打印左上、右上、中间、左下、右下x应该变为的图形
dfs(cur-,x,y);
dfs(cur-,x,y+*s);
dfs(cur-,x+s,y+s);
dfs(cur-,x+*s,y);
dfs(cur-,x+*s,y+*s);
}
int main()
{
int n;
while(~scanf("%d",&n))
{
if(n==-) break;
memset(a,' ',sizeof(a));
dfs(n,,);
int s=(int)pow(3.0,n-);
for(int i=;i<=s;i++)
{
a[i][s+]='\0';//3的n-1次方后面没有多余空格 }
for(int i=;i<=s;i++)
{
printf("%s\n",a[i]+);
}
printf("-\n");
}
return ;
}

详解代码

POJ 2083 Fractal 分形题目的更多相关文章

  1. POJ 2083 Fractal 分形

    去年校赛团队赛就有一道分形让所有大一新生欲生欲死…… 当时就想学了 结果一直拖到…… 今天上午…… 马上要省选了 才会一点基础分形…… 还是自己不够努力啊…… 分形主要是要找到递归点…… 还有深度…… ...

  2. poj 2083 Fractal 递归 图形打印

    题目链接: http://poj.org/problem?id=2083 题目描述: n = 1时,图形b[1]是X n = 2时,图形b[2]是X  X        X               ...

  3. POJ 2083 Fractal

    Fractal Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6646   Accepted: 3297 Descripti ...

  4. ( 递归 )Fractal -- POJ -- 2083

    http://poj.org/problem?id=2083 Fractal Time Limit: 1000MS   Memory Limit: 30000K Total Submissions:  ...

  5. POJ 3845 Fractal(计算几何の旋转缩放)

    Description Fractals are really cool mathematical objects. They have a lot of interesting properties ...

  6. Repeater POJ - 3768 (分形)

    Repeater POJ - 3768 Harmony is indispensible in our daily life and no one can live without it----may ...

  7. ACM/ICPC 之 分治法入门(画图模拟:POJ 2083)

    题意:大致就是要求画出这个有规律的Fractal图形了= = 例如 1 对应 X 2 对应 X  X   X    X  X 这个题是个理解分治法很典型的例子(详情请参见Code) 分治法:不断缩小规 ...

  8. spfa+floyed+最长路+差分约束系统(F - XYZZY POJ - 1932)(题目起这么长感觉有点慌--)

    题目链接:https://cn.vjudge.net/contest/276233#problem/F 题目大意:给你n个房子能到达的地方,然后每进入一个房子,会消耗一定的生命值(有可能是负),问你一 ...

  9. poj 2186 强连通入门题目

    每头牛的梦想就是成为牛群中最受欢迎的牛. 在一群N(1 <= N <= 10,000)母牛中, 你可以得到M(1 <= M <= 50,000)有序的形式对(A,B),告诉你母 ...

随机推荐

  1. VB网络编程中Winsock的使用

    原文链接:http://tech.163.com/06/0407/14/2E46BB930009159S.html 如同上面的内容所描述的,不论您使用UDP协议或是TCP协议,Winsock控件都可以 ...

  2. 安装postgis,使用postgis导入shapefile的步骤总结

    最近在做开源WebGIS方面的工作,要使用postgis导入shapefile数据.难点在安装过程和导入时命令行参数的使用,以下分别作个介绍,希望对大家有点用 一.安装postgis (1)首先到po ...

  3. STS启动失败:Failed to load the JNI shared library

    版本位不一致 jdk 版本 ↓ eclipse 版本(%STS_HOME%/STS.ini)

  4. 在window平台下,自己DIY编译OpenSSL,Libcurl ,来支持HTTPS传输协议

    1 缘起 原来就了解些libcurl,一直没有机会在项目实际使用libcurl.   恰好最近一个云存储的项目,服务器使用openstack 恰好我负责现在的一个云存储SDK c++版本的开发中. 与 ...

  5. 基于udp协议的套接字,socketserver模块,多道技术,进程理论

    进程指的是一个正在进行/运行的程序,进程是用来描述程序执行过程的虚拟概念 进程vs程序 程序:一堆的代码 进程:程序执行的过程 进程的概念起源于操作系统,进程是操作系统最核心的概念,操作系统的其他所有 ...

  6. Write Markdown Syntax Online Document with Sphinx and Pandoc

    There is no doubt that we have to write doc while we are developing software. But How do you write d ...

  7. Mapnik

    Downloads Latest Release The latest release is Mapnik v3.0.22.最新版本是Mapnik v3.0.22. Mapnik 3.0.22 Rel ...

  8. Forward团队-爬虫豆瓣top250项目-需求分析

    一. 需求:1.爬取豆瓣电影top250. 2.获取电影名称,排名,分数,简介,导演,演员. 3.将爬取到的数据保存,以便随时查看. 3.可以将获取到的数据展示给用户. 二. 参考: 豆瓣api参考资 ...

  9. HDU2159_二维完全背包问题

    HDU2159_二维完全背包问题 输入有:经验,忍耐度,怪物种数,限制杀怪数 每一种怪物对应获得的经验值和消耗的耐久值 输出:剩下的最大忍耐度 限制:忍耐度,杀怪个数 在这里把忍耐度看成背包的容量,杀 ...

  10. Partition--使用分区切换来增加修改列的自增属性

    使用分区来将非自增表改为自增表 ------------------------------------------------- --创建测试表TestTable001和TestTable002 C ...