【模拟】【CQOI 2007】【bzoj 1258】三角形tri

1258: [CQOI2007]三角形tri

Time Limit: 5 Sec  Memory Limit: 162 MB
Submit: 276  Solved: 160

Description

画一个等边三角形,把三边的中点连接起来,得到四个三角形,把它们称为T1,T2,T3,T4,如图1。把前三个三角形也这样划分,得到12个更小的三角形:T11,T12,T13,T14,T21,T22,T23,T24,T31,T32,T33,T34,如图2。

把编号以1,2,3结尾的三角形又继续划分…最后得到的分形称为Sierpinski三角形。 图1. 图2. 如果B不包含A,且A的某一条完整的边是B的某条边的一部分,则我们说A靠在B的边上。例如T12靠在T24和T4上,但不靠在T32上。给出Spierpinski三角形中的一个三角形,找出它靠着的所有三角形。

Input

输入仅一行,即三角形的编号,以T开头,后面有n个1到4的数字。仅最后一个数字可能为4。

Output

输出每行一个三角形编号,按字典序从小到大排列。

Sample Input

T312

Sample Output

T314
T34
T4

HINT

50%的数据满足:1<=n<=5
100%的数据满足:1<=n<=50

题解:

一道挺有意思的题。

先定义一下同阶,是指编号长度相同的两个三角形,比如T123和T122。

首先我们可以发现,如果结尾是4,那么我们只需要输出和它同阶的末尾是1,2,3的就可以了。

因为三角形只有三条边(貌似是废话),所以我们记录一下它每条边的情况就好了,然后O(n)扫一遍就好了。

Code:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;

char ch[100]; int n,m,l;
bool dis[5]={0};

void out(int x,int d){
    for (int i=0; i<=x; i++)
        printf("%c",ch[i]);
    printf("%d\n",d);
}

int main(){
    scanf("%s",&ch);
    l=strlen(ch); l--;

    if (ch[l]==‘4‘){
        for (int i=1; i<=3; i++)
            out(l-1,i);
        return 0;
    }

    if (ch[l]==‘1‘) dis[1]=dis[3]=true;
    else if (ch[l]==‘2‘) dis[1]=dis[2]=true;
    else dis[2]=dis[3]=true;

    out(l-1,4);
    for (int i=l-1; i>=1; i--){
        if (ch[i]==‘1‘){
            if (dis[2])
                out(i-1,4),dis[2]=false;
        }
        else if (ch[i]==‘2‘){
            if (dis[3])
                out(i-1,4),dis[3]=false;
        }
        else if (dis[1])
            out(i-1,4),dis[1]=false;
    }

    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-09 00:25:47

【模拟】【CQOI 2007】【bzoj 1258】三角形tri的相关文章

BZOJ1258: [CQOI2007]三角形tri

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1258 如果最后一位是4,那就改成123就好了. 然后最后一位不是4的话,至多三个答案,然后可以发现把给的串最后一个改成4的一定会有.然后可以发现1继承其祖先12的,2继承13的,3继承23的,然后扫一遍.. (口胡了这么多还是自己找找规律吧TAT #include<cstring> #include<cstdio> #include<iostream> #inclu

【BZOJ做题记录】07.07~?

在NOI一周前重开一个坑 最后更新时间:7.07 11:26 7.06 下午做的几道CQOI题: BZOJ1257: [CQOI2007]余数之和sum:把k mod i写成k-k/i*i然后分段求后面的部分就好了 BZOJ1258: [CQOI2007]三角形tri:在草稿纸上按照位置和边找一下规律就好了 BZOJ1260: [CQOI2007]涂色paint:简单的区间DP BZOJ1303: [CQOI2009]中位数图:小于中位数的改为-1大于的改为1,算一算前缀和然后哈希一下乘一乘就好

三角形类的建立和初步调试

现在的三角形Triangle还比较简单,只有三个点(private)nodei_,nodej_,nodem_.功能也仅仅是初始化三个点init(),打印三角形三个点坐标print(). 首先是Node类,定义在“Node.h”中,如下: class Node { private: double x_; //点的横坐标 double y_; //点的纵坐标 public: Node(); //构造函数x_=0,y_=0; void init(void); //初始化函数,键盘输入横纵坐标 void

9月刷题总结

全是usaco水题.... 贪心(这个要放在首位,思想太重要): [BZOJ]1650: [Usaco2006 Dec]River Hopscotch 跳石子(二分+贪心) [BZOJ]1691: [Usaco2007 Dec]挑剔的美食家(multiset+贪心) [BZOJ]1692 & 1640: [Usaco2007 Dec]队列变换(后缀数组+贪心) [BZOJ]1620: [Usaco2008 Nov]Time Management 时间管理(贪心) [BZOJ]1634: [Usa

7、8月刷题总结

准备开学了囧,7.8月刷题记录,以后好来复习,并且还要好好总结! 数据结构: splay: [BZOJ]1503: [NOI2004]郁闷的出纳员(Splay) [BZOJ]1269: [AHOI2006]文本编辑器editor(Splay) [BZOJ]1507: [NOI2003]Editor(Splay) treap: [BZOJ]1862: [Zjoi2006]GameZ游戏排名系统 & 1056: [HAOI2008]排名系统(treap+非常小心) [BZOJ]3224: Tyvj

开源游戏列表

OpenArena 游戏名称 发布 更新 游戏类型 引擎授权协议 内容授权协议 补充信息 0 A.D. 2003 2015 即时战略游戏 GPLv2 CC-BY-SA 风格类似Age of Empires Abuse (电子游戏) 1996 2009 平台动作游戏 公有领域作品 共享软件协议发布[1]   Advanced Strategic Command 2003 2013 回合制策略游戏 GPLv2 GPLv2 战岛系列第二作复刻 Aleph One 2000 2011 第一人称射击游戏

软件测试(四)主路径覆盖hw3

原题中代码 /******************************************************* * Finds and prints n prime integers * Jeff Offutt, Spring 2003 ******************************************************/ public static void printPrimes (int n) { int curPrime; // Value curr

OI本月刷水记录

bzoj 1044 硬币购物 如果没有每个硬币的个数限制,这就是一个完全背包计数问题,现在我们注意到硬币个数很少,于是我们分别考虑一下每个硬币不符合条件的情况,容斥一下即可 bzoj 1225假如不考虑高精度的情况,那么转移还是好考虑的 f[i][j]表示前i个质数有j的约数最小数字 f[i][j]=minprime[i]k|jf[i?1][j/(k+1)]?prime[i]k 但万恶的高精度啊= =,于是改成搜索,然后用对数来表示,就好了 bzoj 2440 一道很神的数论题,二分+容斥+莫比

[DP总结]状压DP

顾名思义,是用将状态进行二进制压缩成集合的形式来方便DP转移的方法. 一些常用的代码表示如下 i & j //取状态i,j重合部分 i ^ j //取状态i,j不同部分 i | j //合并状态i,j (1 << N) - 1 //表示111-1(N个1) 1 << i - 1 //表示00100-0(1后面有i-1个0,也就是有且仅有二进制下第i位为1) for (int i = 0; i < n; ++ i) if (x & (1 << i))