九度OJ 1006:ZOJ問題(再帰)


時間制限:1秒
メモリ制限:32メガ
特殊問題:いいえ
提出:18621
解決:3197
タイトルの説明:
与えられた文字列('z','o','j'の3文字のみを含む)について、ACできるかどうかを判断します.
ACの有無のルールは次のとおりです.
1.zojエネルギーAC;
2.文字列形式がxzojxであれば、ACも可能であり、xはN個の'o'であってもよいし、空であってもよい.
3.azbjcがAC可能であれば、azbojacもAC可能であり、そのうちa,b,cはN個の'o'または空である.
入力:
入力には、行ごとに'z','o','j'の3つの文字のみを含む文字列があり、文字列の長さは1000以下です.
出力:
与えられた文字列の場合、ACが可能であれば「Accepted」と出力し、そうでなければ「Wrong Answer」と出力します.
サンプル入力:
zoj
ozojo
ozoojoo
oozoojoooo
zooj
ozojo
oooozojo
zojoooo

サンプル出力:
Accepted
Accepted
Accepted
Accepted
Accepted
Accepted
Wrong Answer
Wrong Answer

ソース:
2010年浙江大学のコンピュータとソフトウェア工学の研究の生気試験の本題
考え方:
ルール2 3から,再帰的に解く必要があることは明らかであり,難しくはないが,境界条件判断は誤りやすい.
私は何度かWAを通過した.
コード:
#include <stdio.h>
 
#define N 1000
 
int main(void)
{
    int i, a, b, c;
    char s[N+1];
 
    while (scanf("%s", s) != EOF)
    {
        a = b = c = 0;
        i = 0;
        while (s[i] == 'o')
        {
            i ++;
            a ++;
        }
        if (s[i] != 'z')
        {
            printf("Wrong Answer
"); continue; } i++; while (s[i] == 'o') { i ++; b ++; } if (s[i] != 'j') { printf("Wrong Answer
"); continue; } i++; while (s[i] == 'o') { i ++; c ++; } if (s[i] != '\0') { printf("Wrong Answer
"); continue; } //if (c == a+a*(b-1) && b > 0) while (b > 1) { b --; c -= a; } if (a == c && a >= 0 && b == 1) printf("Accepted
"); else printf("Wrong Answer
"); } return 0; } /************************************************************** Problem: 1006 User: liangrx06 Language: C Result: Accepted Time:30 ms Memory:912 kb ****************************************************************/