###### tags: `zerojudge`
# [a271: 彩色蘿蔔](https://zerojudge.tw/ShowProblem?problemid=a271)
>[name=Jia-Chi, Liang] [time=Fri, Aug 20, 2021, 21:15]
## 題目
在一個神奇的國度裡,有一種兔子,它只吃蘿蔔,且每天只吃一個,蘿蔔有四種顏色,分別為:紅蘿蔔,白蘿蔔,黃蘿蔔,發霉的蘿蔔(黑色),兔子吃了蘿蔔之後,體重會有不同的變化,紅蘿蔔吃了胖xg,白蘿蔔吃了胖yg,黃蘿蔔吃了瘦zg(醃黃蘿蔔真難吃...),發霉的蘿蔔吃了瘦wg(附加狀態:中毒...),現在給你x,y,z,w問你幾天後,兔子的體重!
p.s.中毒會使兔子每天瘦ng(中毒當天不算),且中毒狀態可累加,m是兔子初始的體重。早上先中毒,晚上才吃東西。
上面的敘述很重要,要仔細看!
## 輸入說明
第一行是測資的筆數,每筆測資第一行是x,y,z,w,n,m,第二行是一串數字,1代表紅蘿蔔,2代表白蘿蔔,3代表黃蘿蔔,4代表黑蘿蔔,0代表沒吃。這一行中的數字為兔子這段時間內所吃的食物。
## 輸出說明
請輸出兔子在那段時間後所剩的體重,如果體重有在任意時刻少於等於0請輸出:"bye~Rabbit"(不含引號),不然請印出結束時的體重。(詳情參照範例輸入輸出)
有可能問你第一天的體重歐!(就是問初始體重,也就是那行根本沒輸入)
例如如:
13 312 43 432 567
//空一行
輸出為:567
## Sample Input
4
5 3 2 4 3 10
1 1 2 3 3 3 3 4 3 3
5 3 2 4 3 10
1 1 2 3 3 3 3 4 3 3 2 2 2 2 2 2 2
5 3 2 4 3 10
4 1 3 3 1 1 2 2 1 1 3 1 1 1 1 4
10 3 2 2 1 5
1 4 4 0 0 4 1 2 2 2 0 0 2 2 0
## Sample Output
1g
bye~Rabbit
bye~Rabbit
bye~Rabbit
## 解題思維
如何讀取測資,卡了我很久。
### 大框架
* 讀第一個整數times,讓整個程式運作times次。
* 讀取測資第一行,把數字存到陣列:
* g[0]=0 //因為0表示沒吃
* g[1]=x //紅蘿蔔 + x
* g[2]=y //白蘿蔔 + y
* g[3]=z //黃蘿蔔 - z
* g[4]=w //黑蘿蔔 - w
* g[5]=n //中毒,每天 -n
* g[6]=m //初始體重
讀取完畢後,把g[3]、g[4]設定成負的。
* 讀取測資第二行(eatN)
* 如果已經中毒(isPoison==true)
* 先扣體重:g[6]-=n;
* 如果體重g[6]<=0,兔子死亡(isDie)設定成true,把剩下的數字讀完,結束迴圈。
* 體重增加g[eatN]:
* g[6]+=g[eatN];
* 如果體重g[6]<=0,兔子死亡(isDie)設定成true,把剩下的數字讀完,結束迴圈。
* 如果吃到黑蘿蔔(eatN==4),
* n+=g[5];(n初始=0, 每次中毒都要累加。)
* 中毒(isPoison)設定成true。
* 輸出結果:
* 如果兔子死亡,印出"bye~Rabbit\n"
* 否則,印出體重(g[6])。
### 倒底該怎麼讀輸入?
* times 用 scanf("%d", ×);讀
* x, y, z, m , n, w, 用scanf("%d", &g[i])讀。後面加一個getchar()把\n讀掉。
* 讀測資第二行數字
### 讀取一行數字(c語言)
用getchar()一個一個讀取字元。
如果字元是\n,結束讀取。
如果字元是'0'~'9',轉成整數,存起來。
其他字元不做事。
```c
char ch;
while((ch=getchar())!= '\n'){
if(ch >= '0' && ch <= '9'){
某變數= ch - '0';
}
}
```
### 我遇到的bug
* 測資第一行我也用getchar()去讀,結果:
1. 讀完times 這個整數後,用getchar(),會讀到times後面的\n,測資第一行就被跳過了。
2. 大於10的數字,轉換會出錯。
* 如果中毒多次,扣的體重要累加,不能只扣n。
* 兔子死亡,用flag紀錄,到迴圈外面再print。我之前在迴圈裡面print,break之後,會多印出體重。
* 遇到兔字死亡,要用getchar()把剩下的數字讀完,之後才break。不然下一筆測資會讀錯。
## 程式碼
```c=
#include <stdio.h>
int main()
{
int times, g[7], eatN, isPoison, isDie, n;
char ch;
scanf("%d", ×);
while(times--){//讓整個程式運作times次
g[0]=0;
//讀取測資第一行
for (int i=1; i<=6; i++) scanf("%d", &g[i]);
g[3] = -g[3];//把g[3]、g[4]設定成負的。
g[4] = -g[4];
ch = getchar();//讀走換行符號
//printf("get: %d Line 1\n", ch);
//讀取測資第二行(eatN)
isPoison = 0;
isDie = 0;
n = 0;//中毒扣分初始 = 0
while((ch=getchar())!= '\n'){
//printf("get: %c\n", ch);
if (ch >= '0' && ch <='9'){
eatN = ch - '0';
//如果已經中毒
if (isPoison){
g[6]-=n;//先扣體重
if (g[6]<=0){//如果體重g[6]<=0,印出"bye~Rabbit",結束迴圈。
isDie=1;
while((ch=getchar())!= '\n');
break;
}
}
//體重增加g[eatN]
g[6]+=g[eatN];
if (g[6]<=0){//如果體重g[6]<=0,印出"bye~Rabbit",結束迴圈。
isDie=1;
while((ch=getchar())!= '\n');
break;
}
if (eatN==4) {
n += g[5];
isPoison = 1;//如果吃到黑蘿蔔,中毒(isPoison)設定成true
}
}
}
if (isDie || g[6]==0) printf("bye~Rabbit\n");
else printf("%dg\n", g[6]);
}
return 0;
}
```