【洛谷1580】yyy loves Easter_Egg I(字串處理題)
阿新 • • 發佈:2018-11-22
大致題意: 略。(一道模擬題,自己去看題面吧)
幾個字元陣列函式
純粹是一道字串處理題,就當是學了一下各種與字元陣列相關的函式吧!
\(gets()\):這個是比較常用的函式,就是讀入一行的字元。
\(strlen()\):求出字元陣列的長度。
\(sscanf()\):從一個字元陣列中讀入,用法與\(scanf\)類似。
\(strstr()\):在一個字元陣列中找到另一個字元陣列第一次出現的位置,然後返回這個位置及其之後的字元。
\(strcmp()\):比較兩個字元陣列是否有差異。
\(count()\):後來才知道還有一個這麼神奇的函式,統計一個字元在字元陣列中出現的次數。我做的時候自己手寫了一個。
瞭解了這些函式,其實這道題就比較簡單了。
大致思路
先讀入第一行,用一個字元陣列\(target\)存下第一個被\(@\)的人,並開一個變數\(cnt\)記錄當前行數。
接下來,每次讀入一個字元陣列,如果讀完了,就輸出"好隊形"。
然後找出當前說話的人的名字,比較其與\(target\),若相同則輸出"炸成功"。
接下來是判斷這句話中存在的\(@\)個數是否為\(1\),不為\(1\)則輸出"炸失敗"。
然後判斷被\(@\)的人是否為\(target\),若不是,也輸出"炸失敗"。
具體實現詳見程式碼。
程式碼
#include<bits/stdc++.h> #define max(x,y) ((x)>(y)?(x):(y)) #define min(x,y) ((x)<(y)?(x):(y)) #define Gmax(x,y) (x<(y)&&(x=(y))) #define Gmin(x,y) (x>(y)&&(x=(y))) #define abs(x) ((x)<0?-(x):(x)) #define swap(x,y) (x^=y^=x^=y) #define uint unsigned int #define LL long long #define ull unsigned long long #define INF 1000000000 #define N 1000 #define hl_AK_NOI true #define GetAt(s,t) (sscanf(strstr(s,"@"),"@yyy loves %s",t))//找到被@的物件 using namespace std; char now[N+5],At[N+5],cur[N+5],target[N+5]; inline bool check(char *s,int len)//判斷字元陣列中含@個數是否為1,其實可以用count()函式替代 { register int i,tot=0; for(i=0;i<len;++i) if(!(s[i]^'@')&&tot++) return false;//如果出現次數大於1,返回false return tot;//如果出現次數為1,返回true;如果出現次數為0,返回false } int main() { register int cnt=1,len; gets(now),GetAt(now,target);//用target存下第一個被@的人 while(hl_AK_NOI) { if(++cnt,gets(now),len=strlen(now),len<2) return printf("Unsuccessful @yyy loves %s attempt\n%d\nGood Queue Shape",target,cnt-1),0;//判斷是否讀完 if(sscanf(now,"yyy loves %s",cur),!strcmp(cur,target)) return printf("Successful @yyy loves %s attempt",target),0;//比較當前說話的人與target if(!check(now,len)) return printf("Unsuccessful @yyy loves %s attempt\n%d\nyyy loves %s",target,cnt,cur),0;//判斷這句話中存在的@個數是否為1 if(GetAt(now,At),strcmp(At,target)) return printf("Unsuccessful @yyy loves %s attempt\n%d\nyyy loves %s",target,cnt,cur),0;//判斷被@的人是否為target } return 0; }