Week 13

Homework Review 

Laurice

387/紙包雞

題目:

輸入由上括號和下括號組成,表示某個學生製作雞包紙料理的過程。上括號「(」代表把雞包紙鋪上去,下括號「)」代表用外層的東西把內層的東西包起來(如果最內層沒有雞包紙了,他可能是拿了包雞紙或其他奇怪的東西來包)

 

規則:

1.有任何一個雞包紙沒有包起來。

2.有非雞包紙的東西被包進去了。

3.最後的料理沒有被包進同一個雞包紙中。

來看看哪些是對的

 

1. ((()()))

2. (((()))

3. ()()()()

4. ()(()))

把前面的規則翻譯成白話文

1.上括下括要匹配

2. 不能有非括號的字元

3. 最外層要由一組括號括起來 

要怎麼判斷括號是否匹配呢?

1. 到後面才知道前面到底有沒有配到

2. 一個下括抵掉最近的一個上括

 

-> 咦,怎麼好像有last in first out的感覺

 

所以要用什麼實作呢?

Stack!!!

 

(((()))

(

(

(

(

#include<iostream>
#include<stack>
#include<cstring>

int main(){
    std::stack<int> x;
    char in[1024];
    std::cin >> in;
    int n = strlen(in);
    for(i=0;i<n;i++){
        if(in[i] == '(')
            x.push(1);
        else if(in[i] == ')'){
            x.pop();
        }
    }
}

好像少了很多東西???

#include<iostream>
#include<stack>
#include<cstring>

int main(){
    std::stack<int> x;
    char in[1024];
    std::cin >> in;
    int n = strlen(in);
    int i, flag = 1;
    for(i=0;i<n;i++){
        if(i!=0 && x.size() == 0){
            flag = 0;
            break;
        }
        if(in[i] == '(')
            x.push(1);
        else if(in[i] == ')'){
            if(x.size() == 0){
                ...........
            }
            x.pop();
        }
    }
    if(flag == 0 || x.size() != 0)
       ........
    else
       ........
    return 0;
}

還需要確認

1. 最外層是不是被一組括號包住

2. 讀到一半stack裡就沒東西了!?

3. 最後stack裡還有東西??

389/Vim

題目:

有 N 個指令,最後會以指令 q 結尾,其中1<N<=200
每行有可能是以下七種操作之一:
l 游標向右(若游標正指向「整個list的最尾巴」則不動作)
h 游標向左(若游標正指向「整個list的最開頭」則不動作)
0 游標跑到該行最前面(即「整個list的最開頭」或「換行字元的下一個字元」)
$ 游標跑道該行最後面(即「整個list的最尾巴」或「該行最後面的換行字元」)
i Str 插入一個字串Str到現在游標之後,並把游標移到插入的字串之後,其中Str可以是任意英文字母或數字。
n 插入一個換行字元('\n')到線在游標之後,並把游標移到插入的換行字元之後。
x 刪除現在游標之前的一個字元。
q 結束程式,印出編輯器中目前的文字

需要一個可以讓我自由插入、刪減東西的資料結構

Array??

Stack??

題目都已經提示了XDDD

List!!!

本題重點,怎麼在list中自由移動並且增減內容呢?

使用iterator

 

1. list開頭:l.begin()

2. list結尾:l.end()

3. 插入東西:l.insert(it, c)

4. 刪東西:it = l.erase (it)

5. 看iterator現在指到什麼東西:*it

處理不知道長度的string: 用std::string

可以參考本份投影片:

https://drive.google.com/file/d/0Bzxow2VOUeFGOE1vWnVqVWNfcXM/view 

 

1. 確定在iterator往前/往後移時,不會超出list的範圍

2. erase時記得要接回傳值

    it = l.erase(it)

    不然"可能"會有segmentation fault

3. 記得初始化iterator

好多Runtime error怎麼辦??

一些小小的提醒:

1. 指令每次只有一個字元,而且只會用一次,所以不需要開       陣列存他們

2. 像這種以某個輸入當結束的程式,讀多少做多少,不用先       把所有指令讀進來才開始做

std::list<char> l;
std::list<char>::iterator it = l.begin();
char c;
std::string s;

while(1){
    std:: cin >> c;
    if(c == '0'){
    //0 游標跑到該行最前面(即「整個list的最開頭」或「換行字元的下一個字元」)
        while (it != l.begin() && *it != '\n')
            it--;
        if (*it == '\n')
            it++;
    }
    else if(c == 'i'){
    //i Str 插入一個字串Str到現在游標之後,並把游標移到插入的字串之後,其中Str可以是任意英文字母或數字
        std::cin >> s;
        for (int i=0;i<s.size();i++)
            l.insert(it, s[i]);
    }
    else if(c == 'x'){
    //x 刪除現在游標之前的一個字元
        if (it != l.begin()){
            it--;
            it = l.erase(it);
        }
    }

    //.........................
}

392/美國隊長 英雄內戰

題目:

每個英雄有五種能力值,其中領導力和愛心尤其重要,戰鬥時能發揮200%的影響力,請把英雄由強到弱排序,如果能力值比完後還是不分上下,請按英雄名字的字典序排

這麼多能力值該怎麼辦??

用struct把英雄的資料包起來~

#include<iostream>

struct Hero{
    string name;
    int fight, lead, agile, special, heart;
    int total_power;
};


void cal_total_power(Hero* a){
    a -> total_power = a->fight + 2 * a->lead + a->agile + a->special + 2 * a->heart;
    return;
}
    

int main(){
    Hero hero_list[1000000];
    int n;
    for(int i=0;i<n;i++){
        std::cin >> hero_list[i].name >> hero_list[i].lead......
        cal_total_power(&hero[i]);
    }
    //...........
}

怎麼排序呢?

當然就是algorithm裡面的sort囉

然後乖乖自己想個compare照著題目要求比序吧

bool compare(hero a,hero b){
	if(a.total_power>b.total_power)
	    return 1;
        //領導力->愛心->格鬥力->移動力->特殊技能
	else if(a.lead>b.lead)
            return 1;
        else if
            //............
        else if(a.name<b.name)
            return 1;
        else return 0;
};


int main(){
    //..............
    sort(hero_list, hero_list + n, compare);
    //............
}

這次大家作業都慘慘的QQ

題目不難只是細節多,有點煩

請善用 John Cena發問~~~

W13 HW review

By austinlaurice

W13 HW review

for CSIE sprout

  • 654