POJ 2083 Fractal 分形题目
这两天自学了一线算法导论里分治策略的内容,秉着只有真正投入投入编程,才能更好的理解一种算法的思想的想法,兴致勃勃地找一些入门的题来学习。
搜了一下最后把目光锁定在了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 分形题目的更多相关文章
- POJ 2083 Fractal 分形
去年校赛团队赛就有一道分形让所有大一新生欲生欲死…… 当时就想学了 结果一直拖到…… 今天上午…… 马上要省选了 才会一点基础分形…… 还是自己不够努力啊…… 分形主要是要找到递归点…… 还有深度…… ...
- poj 2083 Fractal 递归 图形打印
题目链接: http://poj.org/problem?id=2083 题目描述: n = 1时,图形b[1]是X n = 2时,图形b[2]是X X X ...
- POJ 2083 Fractal
Fractal Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6646 Accepted: 3297 Descripti ...
- ( 递归 )Fractal -- POJ -- 2083
http://poj.org/problem?id=2083 Fractal Time Limit: 1000MS Memory Limit: 30000K Total Submissions: ...
- POJ 3845 Fractal(计算几何の旋转缩放)
Description Fractals are really cool mathematical objects. They have a lot of interesting properties ...
- Repeater POJ - 3768 (分形)
Repeater POJ - 3768 Harmony is indispensible in our daily life and no one can live without it----may ...
- ACM/ICPC 之 分治法入门(画图模拟:POJ 2083)
题意:大致就是要求画出这个有规律的Fractal图形了= = 例如 1 对应 X 2 对应 X X X X X 这个题是个理解分治法很典型的例子(详情请参见Code) 分治法:不断缩小规 ...
- spfa+floyed+最长路+差分约束系统(F - XYZZY POJ - 1932)(题目起这么长感觉有点慌--)
题目链接:https://cn.vjudge.net/contest/276233#problem/F 题目大意:给你n个房子能到达的地方,然后每进入一个房子,会消耗一定的生命值(有可能是负),问你一 ...
- poj 2186 强连通入门题目
每头牛的梦想就是成为牛群中最受欢迎的牛. 在一群N(1 <= N <= 10,000)母牛中, 你可以得到M(1 <= M <= 50,000)有序的形式对(A,B),告诉你母 ...
随机推荐
- xmlns 实例分析
<?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Soft ...
- (转)Memcache内存分配策略
转自:http://hi.baidu.com/software_one/item/0a0a6712dc7a319899ce33e0 一.Memcache内存分配机制 关于这个机制网上有很多解释的,我个 ...
- urllib.parse.parse_qsl 的一个小问题
最近在使用urllib时发现的一个问题,记录一下. 首先请分别执行下面这两句代码: 1."你好".encode("utf8").decode("gbk ...
- delphi编写与调用DLL(delphi7下测试通过)
http://blog.sina.com.cn/s/blog_4dbbf76f01000anz.html delphi编写DLL 下面在delphi中编写一个简单的dll,在该dll中只有一个max函 ...
- consul集群docker版本脚本
https://blog.csdn.net/fenglailea/article/details/79098246 docker run -d --name node1 -e 'CONSUL_LOCA ...
- C# 读取资源文件.resx 中的xml资源
主要是以字符串的形式来读取xml,然后通过遍历读取节点,通过节点属性名称获取属性值 /// <summary> /// 初始化OPC参数配置 /// </summary> // ...
- Seaching TreeVIew WPF
项目中有一个树形结构的资源,需要支持搜索功能,搜索出来的结果还是需要按照树形结构展示,下面是简单实现的demo. 1.首先创建TreeViewItem的ViewModel,一般情况下,树形结构都包含D ...
- WPF圆角按钮例程
<Window x:Class="WpfApp3.MainWindow" xmlns="http://schemas.microsoft.com/winfx/200 ...
- AJPFX:外汇的爆仓和追加保证金
在外汇交易中,当可用保证金变成0时,账户即会爆仓.而为了防止爆仓,您可以在可用保证金不足时追加保证金以防止爆仓. 例如,您在AJPFX的账户是100倍的杠杆,一手欧美货币对合约为10万美金(1 LOT ...
- A*与IDA*
谨以此文向人工智能先驱,\(A\)*算法发明者\(Nils\ Nilsson\)致敬 推一篇深入研究的博客,而本文更多是粗略理解和习题吧. \(A\)*算法是什么?它是启发式搜索的一种,即广度搜索算法 ...