1003 我要通过!
1003 我要通过! (20 分)
第一篇单纯记录解题过程的博客,相较于一般着重考验空间想象力的算法题而言这道题更像是在玩文字游戏,很多人评论它说它在考验数学逻辑,但是我真的想说它考的数学逻辑真的小学生都会,就是在玩文字游戏啊…大喊我不李姐(ㄒoㄒ)
审题思路:
-
字符串中必须仅有
P
、A
、T
这三种字符,不可以包含其它字符(不解释,懂得都懂) -
任意形如
xPATx
的字符串都可以获得“答案正确”,其中x
或者是空字符串,或者是仅由字母A
组成的字符串;这里要注意x是字符串,形如 AAPATAA, AAAAPATAAAA …等字符串都有效。
-
如果
aPbTc
是正确的,那么aPbATca
也是正确的,其中a
、b
、c
均或者是空字符串,或者是仅由字母A
组成的字符串。文字游戏来了!!!
-
aPbTc
正确的情况下aPbATca
才会正确,那么怎么才算aPbTc
正确呢?只有像1,2中所描述的xPATx
的形式了这样推算一下,假设
aPbTc
是APATA
, 那么aPbATca
就是APAATAA
,APAATAA
就也是正确的。 -
“其中
a
、b
、c
均或者是空字符串,或者是仅由字母A
组成的字符串”,那么意思就是只要当前表达式是正确的就都可以当作aPbTc
来看咯,以下图解,(例子不是很好,初始式子应该设成AAPATAA
的,会更容易看出来,有兴趣的自己画吧)可以得到aR = aL * aM
-
主要测试点:
总结一下不咋正经的测试点吧,主要刚开始做有个测试点我挂了。
PA
TAP
AT
代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine();
for (int i = 0; i < n; i ++) {
int[] aNum = {0, 0, 0};
int temp = 0;
boolean lock = true;
String str = sc.nextLine();
for (int j = 0; j < str.length(); j ++) {
char c= str.charAt(j);
if (c == 'P' || c == 'A' || c == 'T') {
if ((temp != 0 && c == 'P') || (temp != 1 && c == 'T')) {
lock = false;
break;
} else if (temp == 0 && c == 'P') {
temp ++;
} else if (c == 'A') {
aNum[temp] ++;
} else if (temp == 1 && c == 'T') {
temp ++;
}
} else {
lock = false;
break;
}
}
if (lock && aNum[0] * aNum[1] == aNum[2] && aNum[1] > 0 && temp == 2) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
}
}
是我太久没玩文字游戏吗 。。。哭晕在键盘前