标题:填字母游戏
小明经常玩 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,否则按无效代码处理。