题解:UVA576 Haiku Review

· · 题解

UVA576 Haiku Review 俳句判断

题目大意

多组数据,每组数据给定三句诗,判断它是否是俳句。

三句诗成俳句,当且仅当每句诗中的音节数分别为 575。一句诗的音节数是构成它所有单词的音节数之和。

为了简化问题,在本题中,一个单词中任意长度的连续元音字母认为是一个音节。(元音字母有 \texttt{a,e,i,o,u,y}

解题思路

直接按照题意模拟即可。

输入部分,这里使用了 getline 获取整行,并采用 stringstream 分割出每个单词。

代码

// Problem: Haiku Review
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/UVA576
// Memory Limit: 0 MB
// Time Limit: 3000 ms
// Create Time: 2024-02-05 20:27:36

#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<stack>
#include<map>
#include<queue>
#include<algorithm>
#include<sstream>
using namespace std;
/*================*/
string s,poem[5];
int cnt[5],ans[5]={0,5,7,5};
bool f;

bool isvol(char c) {   //判断是否是元音
    return c=='a'||c=='e'||c=='i'||c=='o'||c=='u'||c=='y';
}

int main() {
    //cin.ignore(1024,'\n');
    while (getline(cin,s)&&s!="e/o/i") {   //判断输入是否结束
        stringstream ss(s);
        for (int i=1;i<=3;i++)
            getline(ss,poem[i],'/');
        memset(cnt,0,sizeof(cnt));
        for (int i=1;i<=3;i++) {
            for (int j=0;j<poem[i].length()-1;j++)
                if (isvol(poem[i][j])&&(!isvol(poem[i][j+1])))   //当前字母是元音,后一个字母不是,音节数+1
                    cnt[i]++;
            if (isvol(poem[i][poem[i].length()-1])) cnt[i]++;   //判断最后一个字母
        }
        f=1;
        for (int i=1;i<=3;i++)
            if (cnt[i]!=ans[i]) {
                cout<<i<<"\n";
                f=0;
                break;
            }
        if (f) cout<<"Y\n";
    }
    return 0;
}