PTA乙級_1003通過します!(20点)C言語版

7550 ワード

「答えが正しい」は、自動判定システムが与える最も喜ばしい返事だ.本題はPATの「答えが正しい」大派送に属する--読み込んだ文字列が以下の条件を満たす限り、システムは「答えが正しい」を出力し、そうでなければ「答えが間違っている」を出力する.「正解」を得る条件は、1、文字列にはP、A、Tの3文字しかなく、他の文字を含んではいけない.2、任意の形のxPATxのような文字列はすべて“答えが正しい”を得ることができて、ここでxはあるいは空の文字列で、あるいはアルファベットAだけからなる文字列です;3、aPbTcが正しい場合、aPbATcaも正しい.ここで、a、b、cはいずれも空の文字列、またはアルファベットAのみからなる文字列である.今すぐPATのために自動審判プログラムを書いて、どの文字列が「答えが正しい」かを判定してください.入力フォーマット:各テスト入力には1つのテスト例が含まれます.1行目は、検出する文字列の個数である正の整数n(<10)を与える.次に、各文字列は1行で、文字列の長さは100を超えず、スペースは含まれません.出力フォーマット:各文字列の検出結果が1行を占め、その文字列が「正解」を得ることができればYESを出力し、そうでなければNOを出力する.入力サンプル:8 PAT PAAT AAPATAA AAPAATAAAAAAAA xPATx PT Whatever APAAATAA出力サンプル:YES YES YES YES YES YES NO NO
考え方:まず私はこのテーマが与えた第3点の意味が少し理解しにくいと思って、私も他の人のを参考にしてやっとテーマの意味を理解します.まとめると、
  • は「P」、「A」、「T」の3文字しか存在しない.
  • 「P」、「T」は一度しか現れず、この順序で前後して現れる.
  • P&Tの間にAがないわけにはいかない.
  • T以降のAの数=Pより前のAの数× P&T中間Aの数.

  • 問題を明らかにすると、問題の難易度は大きくなくなり、3つの位置文字Aの数を記録して0に初期化し、文字列の値を入力するたびに、posの下付きを巧みに設定して、現在どの位置のA文字を正確に記録することに注意します.最後に、判断条件のところは完全に書くことに注意します.
    #include
    #include
    int main() {
    	int i, n, len;
    	char str[100];
    	scanf("%d", &n);
    	while (n--) {
    		scanf("%s", str);
    		len = strlen(str);	
    		int pos = 0, count[3] = {0};
    		for (i = 0; i < len; i++) {
    			if (str[i] == 'A') {
    				count[pos]++;
    			}
    			else if (str[i] == 'P' && pos == 0) {
    				pos = 1;
    			}
    			else if (str[i] == 'T' && pos == 1) {
    				pos = 2;
    			}
    			else {
    				break;
    			}
    		}
    		if (pos==2&&count[1]&&count[2]==count[1]*count[0]){
    			puts("YES");
    		}
    		else {
    			puts("NO");
    		}	
    	}
    	return 0;
    }