UVaLive/LA 6805 Pantun Grader(模拟)

FILE 6805 - Pantun Grader


题目大意:

按照给定的规则,给诗歌打分。有音节、押韵等规则。


解题思路:

仔细读题,主题细节。输入的逗号后不一定有空格。


参考代码:

#include <iostream>
#include <algorithm>
#include <string>
#include <cstdio>
#include <vector>
using namespace std;

const int MAXN = 210;
vector<vector<string> > sentence;
int nCase, cCase;

void init() {
    sentence.clear();
}

int calcSyllable(string word) {
    int len = word.length();
    if (len == 6 && (word.find("ng") != string::npos || word.find("Ng") != string::npos
    || word.find("ny") != string::npos || word.find("Ny") != string::npos)) return 2;
    if (len == 3 && (word[0] == 'a' || word[0] == 'A' || word[0] == 'e' || word[0] == 'E' || word[0] == 'i'
    || word[0] == 'I' || word[0] == 'o' || word[0] == 'O'  || word[0] == 'u' || word[0] == 'U')) return 2;
    if (len >= 6) return 3;
    if (len == 4 || len == 5) return 2;
    if (len <= 3) return 1;
}

void solve() {
    int syllable[MAXN] = {0}, A = 0, B = 0, C = 0, D = 0, E = 0;
    string last[MAXN];

    int n = min(4, (int)sentence.size());

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < sentence[i].size(); j++) {
            syllable[i] += calcSyllable(sentence[i][j]);
            if (j == (int)sentence[i].size() - 1) {
                last[i] = sentence[i][j].substr(sentence[i][j].size() - 2);
            }
        }
        if (syllable[i] >= 8 && syllable[i] <= 12) A += 10;
    }

    for (int i = 0; i < n - 2; i++) {
        if (last[i] == last[i + 2]) B += 20;
    }

    for (int i = 0; i < n - 2; i++) {
        if (syllable[i] == syllable[i + 2]) C += 10;
    }

    if (sentence.size() > 4) {
        D = ((int)sentence.size() - 4) * 10;
    }

    E = A + B + C - D;

    printf("Case #%d: %d %d %d %d %d\n", ++cCase, A, B, C, D, E);
}

int main() {
    scanf("%d", &nCase);
    while (nCase--) {
        init();
        bool flag = false;
        string tmp;
        while (true) {
            string str;
            vector<string> ss;
            if (flag) {
                ss.push_back(tmp);
                flag = false;
            }
            while (cin >> str && str[str.length() - 1] != ',' && str[str.length() - 1] != '.') {
                if (str.find(',') != string::npos) {
                    int pos = str.find_first_of(',');
                    ss.push_back(str.substr(0, pos));
                    sentence.push_back(ss);
                    tmp = str.substr(pos+1);
                    flag = true;
                    break;
                }
                ss.push_back(str);
            }
            if (flag) continue;
            if (str != "." && str != ",") ss.push_back(str.substr(0, str.length() - 1));
            if (str[str.length() - 1] == '.') {
                sentence.push_back(ss);
                solve();
                break;
            }
            if (str[str.length() - 1] == ',') {
                sentence.push_back(ss);
            }
        }
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值