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