标题:填字母游戏
小明经常玩 LOL 游戏上瘾,一次他想挑战K大师,不料K大师说:
“我们先来玩个空格填字母的游戏,要是你不能赢我,就再别玩LOL了”。
K大师在纸上画了一行n个格子,要小明和他交替往其中填入字母。
并且:
1. 轮到某人填的时候,只能在某个空格中填入L或O
2. 谁先让字母组成了“LOL”的字样,谁获胜。
3. 如果所有格子都填满了,仍无法组成LOL,则平局。
小明试验了几次都输了,他很惭愧,希望你能用计算机帮他解开这个谜。
本题的输入格式为:
第一行,数字n(n<10),表示下面有n个初始局面。
接下来,n行,每行一个串,表示开始的局面。
比如:“******”, 表示有6个空格。
“L****”, 表示左边是一个字母L,它的右边是4个空格。
要求输出n个数字,表示对每个局面,如果小明先填,当K大师总是用最强着法的时候,小明的最好结果。
1 表示能赢
-1 表示必输
0 表示可以逼平
例如,
输入:
4
***
L**L
L**L***L
L*****L
则程序应该输出:
0
-1
1
1
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
package Main;
/**
* 这题就是比较麻烦
* 四则运算可以把运算的数转成十进制的String,再用BigInteger来计算
* 然后就是十进制转成n进制,n进制转成十进制
* 还有就是计算a^b,用了快速幂可以加速
*/
import java.math.BigInteger;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
//-----------startTime
// Long start = System.currentTimeMillis();
//
int t = in.nextInt();
String cur = "";
Long num = 0L;
int jin = 10;//默认是10进制
while (t-- != 0) {
String a = in.next();
if (a.equals("CLEAR")) {
cur = "";
} else if (a.equals("EQUAL")) {
System.out.println(cur);
} else if (a.equals("CHANGE")) {
int k = in.nextInt();
jin = k;
cur = ten_changeTo_N(num, k);
// System.out.println(cur);
} else if (a.equals("NUM")) {
Long tmp = in.nextLong();
num = tmp;
cur = String.valueOf(tmp);
} //运算
else if (a.equals("ADD")) {
String ctmp = N_changeTo_TEN(cur, jin);
String b = in.next();//"NUM"
String addb = in.next();//jin 进制的数
addb = N_changeTo_TEN(addb, jin);
// System.out.println(addb);
cur = add(ctmp, addb);
//再转成jin进制的数
num = Long.valueOf(cur);//转成Long值
cur = ten_changeTo_N(num, jin);
t--;
} else if (a.equals("SUB")) {
String ctmp = N_changeTo_TEN(cur, jin);
String b = in.next();//"NUM"
String subb = in.next();//jin 进制的数
subb = N_changeTo_TEN(subb, jin);
cur = sub(ctmp, subb);
//再转成jin进制的数
num = Long.valueOf(cur);//转成Long值
cur = ten_changeTo_N(num, jin);
t--;
} else if (a.equals("MUL")) {
String ctmp = N_changeTo_TEN(cur, jin);
String b = in.next();//"NUM"
String mulb = in.next();//jin 进制的数
mulb = N_changeTo_TEN(mulb, jin);
cur = sub(ctmp, mulb);
//再转成jin进制的数
num = Long.valueOf(cur);//转成Long值
cur = ten_changeTo_N(num, jin);
t--;
} else if (a.equals("DIV")) {
String ctmp = N_changeTo_TEN(cur, jin);
String b = in.next();//"NUM"
String divb = in.next();//jin 进制的数
divb = N_changeTo_TEN(divb, jin);
cur = sub(ctmp, divb);
//再转成jin进制的数
num = Long.valueOf(cur);//转成Long值
cur = ten_changeTo_N(num, jin);
t--;
} else if (a.equals("MOD")) {
String ctmp = N_changeTo_TEN(cur, jin);
String b = in.next();//"NUM"
String modb = in.next();//jin 进制的数
modb = N_changeTo_TEN(modb, jin);
cur = sub(ctmp, modb);
//再转成jin进制的数
num = Long.valueOf(cur);//转成Long值
cur = ten_changeTo_N(num, jin);
t--;
}
}
//--------endTime
// Long end = System.currentTimeMillis();
//The all execute time
// System.out.println(end - start);
}
//四则运算
private static String add(String ctmp, String addb) {
BigInteger a = new BigInteger(ctmp);
BigInteger b = new BigInteger(addb);
return String.valueOf(a.add(b));
}
private static String sub(String ctmp, String addb) {
BigInteger a = new BigInteger(ctmp);
BigInteger b = new BigInteger(addb);
return String.valueOf(a.subtract(b));
}
private static String mul(String ctmp, String addb) {
BigInteger a = new BigInteger(ctmp);
BigInteger b = new BigInteger(addb);
return String.valueOf(a.multiply(b));
}
private static String div(String ctmp, String addb) {
BigInteger a = new BigInteger(ctmp);
BigInteger b = new BigInteger(addb);
return String.valueOf(a.divide(b));
}
private static String mod(String ctmp, String addb) {
BigInteger a = new BigInteger(ctmp);
BigInteger b = new BigInteger(addb);
return String.valueOf(a.mod(b));
}
private static String ten_changeTo_N(Long a, int jin) {
String s = "", result = "";
if (jin <= 10) {
while (a > 0) {
Long k = a%jin;
s = s + (char)(k + '0');
a = a/jin;
}
for (int i = 0; i < s.length(); i++) {
result += s.charAt(s.length() - i - 1);
}
} else {
while (a > 0) {
Long k = a%jin;
if (k >= 10) {
k -= 10;
s = s + (char)('A' + k);
} else {
s = s + (char)(k + '0');
}
a = a/jin;
}
for (int i = 0; i < s.length(); i++) {
result += s.charAt(s.length() - i - 1);
}
}
return result;
}
private static String N_changeTo_TEN(String n, int jin) {
Long sum = 0L;
for (int i = 0; i < n.length(); i++) {
char ch = n.charAt(n.length() - 1 - i);
if (ch >= '0' && ch <= '9') {
Long a = (long)(ch - '0');
sum += a*fast_mod((long) jin, i);
} else {
Long a = (long) (ch - 'A' + 10);
sum += a*fast_mod((long) jin, i);
}
}
return String.valueOf(sum).toString();
}
//快速幂计算a^b;
public static Long fast_mod(Long a, int b) {
Long ans = 1L;
Long base = a;
while (b > 0) {
if (b%2 != 0) {
ans = ans*base;
}
base = base*base;
b >>= 1;
}
return ans;
}
private static void test() {
BigInteger a = new BigInteger("2");
BigInteger time = new BigInteger("0");
BigInteger end = new BigInteger("63");
do {
if (time.equals(end)) break;
a = a.multiply(new BigInteger("2"));
time = time.add(new BigInteger("1"));
} while (true);
System.out.println(a);
}
}
注意:主类的名字必须是:Main,否则按无效代码处理。