24h購物| | PChome| 登入
2011-07-20 11:36:44| 人氣265| 回應0 | 上一篇 | 下一篇

a190. 公元2317: 手觸之役

推薦 0 收藏 0 轉貼0 訂閱站台

a190. 公元2317: 手觸之役

內容 :

     二十四世紀,人類文明進入太空時代,地球與宇宙中的各種外星文明有了交流與貿易,人們的視野大大擴增。地球也成功地加入宇宙的區域同盟組織「銀河聯盟」,地球在聯盟中有重要的地理位置,因此成為了銀河聯盟與外星系聯絡的重要轉運站,地球因而達到前所未有的繁榮。

      然而,公元2305年,位在遙遠星系的手觸星球上的居民(簡稱手觸人)發生嚴重戰亂,一場激烈核戰過後,手觸星無法居住任何生命。殘存的手觸人為了生存下去,開始對宇宙中各星球征戰,因為他們強大的武力,許多星球皆被征服,被迫臣服於手觸人的統治,任憑他們大肆搜括星球上的資源,直到自己星球資源殆盡。

     不久之後,手觸人將目標轉向銀河系,地球身為銀河聯盟的對外聯絡橋樑,理所當然成為手觸人第一個征服目標。地球因為不敵其強大火力,被迫臣服於手觸人下。

      公元2317年,熱愛程式解題的阿窘眼睜睜看著地球遭受摧殘,感到十分悲憤、不滿,決定要報仇,因而號召眾多熱愛程式解題的同好組成了地球反抗軍(簡稱ER)。他們認為,要打敗手觸人,就要先了解他們。ER花了幾個月的時間研究手觸文化,卻發生了困難,原因是他們的溝通語言十分難懂,但是他們仍然發現了一些規則。

     手觸人的長相如蛇一般,呈長條狀,身體的各個部位皆可自由彎曲、摺疊,由於他們沒有發聲器官(即可以利用空氣振動傳送訊息的器官),他們溝通方法是將自己身體不斷摺疊,藉此傳遞訊息。摺疊的方法十分簡單,首先,先將自己身體拉直,取正中間的地方往逆時針方向或順時針方向彎曲,直到頭尾相鄰,此為第一摺;接著再取摺疊後中間的地方往逆時針方向或順時針方向摺疊,此為第二摺;利用這個方法不斷摺半摺半,他們就可以有許多摺疊的組合。

 

ER發現溝通的訊息似乎與摺疊後自頭到尾各身體部分逆時針或順時針的摺疊方向有關。但是,ER中沒有人知道如何在只知道摺疊方法的情況下,得出最終訊息。此時,ER接獲密報,得知在21世紀初有一個程式實力非常強的神人,沒有錯!那個人正是坐在電腦前面,對於題目劇情感到很囧的你!ER發出了超時空訊息,請你寫一個程式來幫幫他們,地球的未來就靠你了!

 

輸入說明 :

測試資料會先輸入一個正整數T(2<=T<=20),表示手觸人摺疊的次數。接著,會有T個數,依次表示摺疊的方法,0代表逆時針、1代表順時針。以T=0時表輸入結束,不須對該行做任何輸出。

 

輸出說明 :

請從手觸人的頭至尾轉折處之方向做輸出,0表逆時針、1表順時針,轉折之間請加入一個空格,當轉折結束,以一個換行做結尾。

 

範例輸入 :

2
1 0
3
0 0 0
0

範例輸出 :

0 1 1
0 0 1 0 0 1 1

提示 :

 

出處 :

我自己 (管理:genius0615)



先批評一下, 雖然批評是不對的
「為什麼會有觸手 (`д´)っ゛, 而且還用小畫家畫 (`д´)っ゛, 題目根本看不懂 (`д´)っ゛」
「(`д´)っ゛當作摺紙不就好了, (`д´)っ゛那個圖都黏在一起了, (`д´)っ゛我居然還是看懂了」
作法 : 模擬
其實不必想太多
假使輸入是 0 1 1
0 ----- 0
0 1 ----- 1 0 0
0 1 1 ---- 1 1 0 0 1 0 0
看到了沒有, 紅色是延續之前的, 假使放入是 0, 左邊插 1 右邊插 0,
反之 左邊插 0, 右邊插 1, 我用遞迴寫的, 有點懶了

時間抓很緊, 不稍微優化可不行

/**********************************************************************************/
/*  Problem: a190 "公元2317: 手觸之役" from 我自己                       */
/*  Language: C                                                                   */
/*  Result: AC (472ms, 240KB) on ZeroJudge                                        */
/*  Author: morris1028 at 2011-07-18 23:20:57                                     */
/**********************************************************************************/


#include<stdio.h>
short w[20];
void doing(int l, int h, int dv, char s) {
    if(l < h) {
        int m = (l+h)/2;
        doing(l, m, dv+1, '0' + w[dv]);
        putchar(s), putchar(' ');
        doing(m+1, h, dv+1, '0' + !w[dv]);
    }
}
main() {
    int s[21] = {1}, n, a;
    for(a = 1; a <= 20; a++)    s[a] = s[a-1]*2;
    while(scanf("%d", &n) == 1 && n) {
        for(a = 0; a < n; a++)    scanf("%hd", &w[a]);
        doing(0, s[n]-1, 1, '0' + w[0]);
        puts("");
    }
    return 0;
}

私心的優化輸出
/**********************************************************************************/
/*  Problem: a190 "公元2317: 手觸之役" from 我自己                       */
/*  Language: C                                                                   */
/*  Result: AC (176ms, 2300KB) on ZeroJudge                                       */
/*  Author: morris1028 at 2011-07-18 23:22:50                                     */
/**********************************************************************************/


#include<stdio.h>
char Ans[2097152];
short w[20];
int At;
void doing(int l, int h, int dv, char s) {
    if(l < h) {
        int m = (l+h)/2;
        doing(l, m, dv+1, '0' + w[dv]);
        Ans[At++] = s, Ans[At++] = ' ';
        doing(m+1, h, dv+1, '0' + !w[dv]);
    }
}
main() {
    int s[21] = {1}, n, a;
    for(a = 1; a <= 20; a++)    s[a] = s[a-1]*2;
    while(scanf("%d", &n) == 1 && n) {
        for(a = 0; a < n; a++)    scanf("%hd", &w[a]);
        At = 0, doing(0, s[n]-1, 1, '0' + w[0]), Ans[At] = '\0';
        puts(Ans);
    }
    return 0;
}

台長: Morris
人氣(265) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: ZeroJudge |
此分類下一篇:a192. 接線問題
此分類上一篇:a191. 在世界遙遠的彼方

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文