標籤:
1258: [CQOI2007]三角形tri
Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 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
T314T34T4
HINT
50%的資料滿足:1<=n<=5100%的資料滿足: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;}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
【類比】【CQOI 2007】【bzoj 1258】三角形tri