• PREV-46 试题 历届试题 填字母游戏(DFS+博弈论)
  • PREV-54 试题 历届试题 合根植物(并查集模板)
  • PREV-55 试题 历届试题 小计算器(模拟+进制转换API)

PREV-46 试题 历届试题 填字母游戏(DFS+博弈论)

原题链接:http://lx.lanqiao.cn/problem.page?gpid=T450


【问题描述】

小明经常玩 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


思路: 博弈论 + 记忆化搜索。

这道题的边界条件:

  • 如果串中有LO或LL或*OL,则现在走的玩家必赢。

  • 如果串中没有*,则平局。

用一个map<string, int> m记录每个局面的结果,这样就不会重复计算。

Code:

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;public class Main {static Map<String, Integer> mp = new HashMap<String, Integer>();static String[] ch = { "L", "O" };static int dfs(String str) {//如果集合里面有这个字符串,就直接返回结果if (mp.containsKey(str))return mp.get(str);//如果字符串有“LOL”,那么就直接输了if (str.contains("LOL"))return -1;//长度小于3,也就直接平局了if (str.length() < 3)return 0;//没有空格也平局if (!str.contains("*"))return 0;//用来判断是否有可能平局的boolean ping = false;int len = str.length();for (int i = 0; i < len; i++) {//如果是字符,只需要直接用==,如果是字符串,就要用equalsif (str.charAt(i) == '*') {//暂存String tmp = str;for (int j = 0; j < 2; j++) {//替换指定字符str = tmp.substring(0, i) + ch[j] + tmp.substring(i + 1, len);//存在对手赢的情况,就回溯跳过if (str.contains("L*L") || str.contains("*OL") || str.contains("LO*")) {str = tmp.substring(0, i) + "*" + tmp.substring(i + 1, len);continue;}//搜索对手的情况int next = dfs(str);//回溯str = tmp.substring(0, i) + "*" + tmp.substring(i + 1, len);//对手赢就跳过if (next == 1)continue;else if (next == -1)return 1;else if (next == 0)ping = true;}}}//存在平局状况if (ping) {mp.put(str, 0);return 0;}//反正就是输的情况了mp.put(str, -1);return -1;}public static void main(String[] args) {// TODO Auto-generated method stubScanner sc = new Scanner(System.in);int n = sc.nextInt();sc.nextLine();for (int i = 0; i < n; i++) {String str = sc.nextLine();System.out.println(dfs(str));}}
}

PREV-54 试题 历届试题 合根植物(并查集模板)

原题链接:http://lx.lanqiao.cn/problem.page?gpid=T458


【问题描述】

w星球的一个种植园,被分成 m * n 个小格子(东西方向m行,南北方向n列)。每个格子里种了一株合根植物。
  
这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成为一体。

如果我们告诉你哪些小格子间出现了连根现象,你能说出这个园中一共有多少株合根植物吗?


【输入格式】

第一行,两个整数m,n,用空格分开,表示格子的行数、列数(1<m,n<1000)。
  
接下来一行,一个整数k,表示下面还有k行数据(0<k<100000)
  
接下来k行,第行两个整数a,b,表示编号为a的小格子和编号为b的小格子合根了。

格子的编号一行一行,从上到下,从左到右编号。
 
比如:5 * 4 的小格子,编号:
  1 2 3 4
  5 6 7 8
  9 10 11 12
  13 14 15 16
  17 18 19 20


【样例输入】

5 4
16
2 3
1 5
5 9
4 8
7 8
9 10
10 11
11 12
10 14
12 16
14 18
17 18
15 19
19 20
9 13
13 17


【样例输出】

5


【样例说明】

其合根情况参考下图:


思路: 简单并查集模板题。

Code:

import java.util.Scanner;public class Main {static int n, m, k;static int[] root;static int find(int x) {while (root[x] != x) {x = root[x];}return x;}static void combine(int x, int y) {int root1 = find(x);int root2 = find(y);if (root1 != root2) {root[root1] = root2;}}public static void main(String[] args) {// TODO Auto-generated method stubScanner sc = new Scanner(System.in);m = sc.nextInt();n = sc.nextInt();k = sc.nextInt();root = new int[m*n+10];for (int i = 1; i <= m * n; i++) {root[i] = i;}for (int i = 1; i <= k; i++) {int x = sc.nextInt(), y = sc.nextInt();combine(x, y);}int ans = 0;for (int i = 1; i <= m * n; i++) {if (root[i] == i)ans++;}System.out.println(ans);}
}

PREV-55 试题 历届试题 小计算器(模拟+进制转换API)

原题链接:http://lx.lanqiao.cn/problem.page?gpid=T459


【问题描述】

模拟程序型计算器,依次输入指令,可能包含的指令有

  1. 数字:‘NUM X’,X为一个只包含大写字母和数字的字符串,表示一个当前进制的数

  2. 运算指令:‘ADD’,‘SUB’,‘MUL’,‘DIV’,‘MOD’,分别表示加减乘,除法取商,除法取余

  3. 进制转换指令:‘CHANGE K’,将当前进制转换为K进制(2≤K≤36)

  4. 输出指令:‘EQUAL’,以当前进制输出结果

  5. 重置指令:‘CLEAR’,清除当前数字

指令按照以下规则给出:
  数字,运算指令不会连续给出,进制转换指令,输出指令,重置指令有可能连续给出
  运算指令后出现的第一个数字,表示参与运算的数字。且在该运算指令和该数字中间不会出现运算指令和输出指令
  重置指令后出现的第一个数字,表示基础值。且在重置指令和第一个数字中间不会出现运算指令和输出指令
  进制转换指令可能出现在任何地方

运算过程中中间变量均为非负整数,且小于2^63。
  以大写的 ‘A’ ~ ‘Z’ 表示 10~35


【输入格式】

第1行:1个n,表示指令数量

第2…n+1行:每行给出一条指令。指令序列一定以’CLEAR’作为开始,并且满足指令规则


【输出格式】

依次给出每一次’EQUAL’得到的结果


【样例输入】

7
CLEAR
NUM 1024
CHANGE 2
ADD
NUM 100000
CHANGE 8
EQUAL


【样例输出】

2040


思路: 这道题的关键在于进制转换,Long.valueOf()这个函数可以把指定字符串转换为想要的进制。

Code:

import java.util.Scanner;public class Main {static String op = ""; // 运算符static int hex = 10; // 进制static long[] num = new long[3]; // 用来存两个要运算的数public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();sc.nextLine();for (int i = 1; i <= n; i++) {String ss = sc.nextLine();String[] str = ss.split(" "); // 根据空格来分割operate(str);}}// 指令操作public static void operate(String[] str) {switch (str[0]) {case "NUM":if ("".equals(op)) {// Long.valueOf可以把字符串str[1]转换为hex进制的long数值num[0] = Long.valueOf(str[1], hex);} else {num[1] = Long.valueOf(str[1], hex);num[0] = calcute();num[1] = 0;op = "";}break;case "ADD":op = "ADD";break;case "SUB":op = "SUB";break;case "MUL":op = "MUL";break;case "DIV":op = "DIV";break;case "MOD":op = "MOD";break;case "CHANGE":hex = Integer.parseInt(str[1]);break;case "EQUAL":// 因为有可能是十六进制数,所以要转换为字符串形式,然后还要大写System.out.println(Long.toString(num[0], hex).toUpperCase());break;case "CLEAR":num[0] = 0;num[1] = 0;op = "";break;default:break;}}// 运算private static long calcute() {// TODO Auto-generated method stublong ans = 0;switch (op) {case "ADD":ans = num[0] + num[1];break;case "SUB":ans = num[0] - num[1];break;case "MUL":ans = num[0] * num[1];break;case "DIV":ans = num[0] / num[1];break;case "MOD":ans = num[0] % num[1];break;default:break;}return ans;}}

【Java】蓝桥杯历届试题PREV(一)相关推荐

  1. java 蓝桥杯历届试题 回文数字(题解)

    试题 历届试题 回文数字 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的.这样的数字 ...

  2. java 蓝桥杯历届试题 分糖果(题解)

    试题 历届试题 分糖果 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 有n个小朋友围坐成一圈.老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏: 每个小朋友都把自己的糖果分一半 ...

  3. 蓝桥杯c语言试题幸运数,蓝桥杯  历届试题 幸运数  dfs

    时间限制:1.0s   内存限制:256.0MB 问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成 . 首先从1开始写出自然数1,2,3,4,5,6,. ...

  4. 历届试题+九宫重排+java_蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)...

    Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...

  5. [蓝桥杯][历届试题]国王的烦恼(反向+并查集)

    问题 1435: [蓝桥杯][历届试题]国王的烦恼 时间限制: 1Sec 内存限制: 128MB 提交: 802 解决: 213 题目描述 C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了 ...

  6. 蓝桥杯 - 历届试题 - 日期问题

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_33531813/article/details/79516258 </div>&l ...

  7. 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索

    问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...

  8. 二分搜索,POJ2456,NYOJ 914, 区间移位-蓝桥杯-历届试题

    二分搜索是不断缩减可能解的范围来得到最优解, 因为每次是折半, 所以指数爆炸有多快,这个效率就有多高 POJ2456为例, 传送门 简而言之, 就是将牛之间的距离的最小值最大化. #include&l ...

  9. 蓝桥杯历届试题代码参考

    蓝桥杯历届试题代码参考 历届试题 核桃的数量 打印十字图 带分数 剪格子 错误票据 翻硬币 连号区间数 买不到的数目 大臣的旅费 幸运数 横向打印二叉树 危险系数 网络寻路 高僧斗法 格子刷油漆 农场 ...

  10. 问题 1433: [蓝桥杯][历届试题]危险系数(并查集and暴力)

    问题 1433: [蓝桥杯][历届试题]危险系数 时间限制: 1Sec 内存限制: 128MB 提交: 123 解决: 39 题目描述 问题描述 抗日战争时期,冀中平原的地道战曾发挥重要作用. 地道的 ...

最新文章

  1. Apache Traffic Server处理请求的过程
  2. CentOS下安装Hbase
  3. 甲骨文正式宣布将Java EE移交给Eclipse基金会
  4. GIS笔记-使用Geoserver搭建MWTS服务(构建离线GIS服务)
  5. 飞鱼知识变现小程序2.5.3源码_小程序功能模块
  6. python hashlib_python hashlib模块
  7. Linux下的SYN flood***
  8. 拓端tecdat|R语言非线性回归nls探索分析河流阶段性流量数据和评级曲线、流量预测可视化
  9. 股市法则:长线大钱最终胜出(荀玉根、姚佩)
  10. java爬虫新闻网站_java爬虫 之 搜狐新闻爬虫(一)
  11. 1373:鱼塘钓鱼(fishing)
  12. 在学校,你需要知道的8种思维导图的类型及其工作方式
  13. 事务里面的脏读、不可重复读、虚读/幻读
  14. 算法租用游艇问题c语言,动态规划租用游艇问题
  15. 关于微软IIS7安全性
  16. 开源巨献:Google最热门60款开源项目(转)
  17. 诚信比生命更重要,人不诚信难成正果
  18. 利用组合模式来实现组件处理器的工程实践
  19. 使用scala将数据写入linux上的MongoDB数据库
  20. Android模拟器虚拟串口实现串口通信

热门文章

  1. linux进阶-PHP加速器
  2. Xiph.Org基金会 —— 多媒体开源的先锋
  3. 沁恒CH348 USB转8串口芯片
  4. cordova弹框插件 cordova-plugin-dialogs
  5. 土耳其央行行长当得不容易 | 经济学人早报精选
  6. BetterZip 4.2.4 激活版下载安装– Mac上最快速的压缩工具
  7. 我想外包开发一个预约类小程序,大概需要多少钱?
  8. TTL电路和CMOS电路的区别和…
  9. 小白软件帮手(xbrjbs)一个专业安装破解软件的公众号
  10. 【已解决】兼容多个版本CUDA