Java 大学C组 第十届蓝桥杯 2019年国赛真题( 五 )

< '0' || c > '9') c = in.read();while (c >='0' && c <='9') {n = n * 10 + (c & 0xf);c = in.read();}return n;}}
因为数据规模很小,因此暴搜枝剪后也能在约定时间内拿到结果
还可以写一种实现简单的方法效验一下
import java.io.IOException;import java.io.InputStream;import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.StringTokenizer;public class Main {static int n, m, cnt;public static void main(String[] args) {InputReader in = new InputReader(System.in);List rows = new ArrayList();n = in.nextInt();m = in.nextInt();buildRow(0, new boolean[m], rows);dfs(0, rows, new boolean[n][]);System.out.println(cnt);}static void dfs(int depth, List rows, boolean[][] map) {if (depth == n) {for (int i = 0, cnt = 0; i < n; cnt = 0, i++)for (int j = 0; j < m; j++) {if (map[i][j]) cnt++;else cnt = 0;if (cnt == 3) return;}cnt++;} elsefor (boolean[] row: rows) {map[depth] = row;dfs(depth + 1, rows, map);}}static void buildRow(int depth, boolean[] row, List rows) {if (depth == m) {for (int i = 0, cnt = 0; i < m; i++) {if (row[i]) cnt++;else cnt = 0;if (cnt == 3) return;}rows.add(Arrays.copyOf(row, m));} else {buildRow(depth + 1, row, rows);row[depth] = true;buildRow(depth + 1, row, rows);row[depth] = false;}}static class InputReader {BufferedReader read;StringTokenizer tok;String delimiters;InputReader(InputStream in) { this(in, " \n\t\r\f"); }InputReader(InputStream in, String delimiters) {this.read = new BufferedReader(new InputStreamReader(in));this.tok = new StringTokenizer("", "");this.delimiters = delimiters;}String next() {while (!tok.hasMoreTokens())try {tok = new StringTokenizer(read.readLine(), delimiters);} catch (IOException e) {e.fillInStackTrace();}return tok.nextToken();}int nextInt() { return Integer.parseInt(next()); }}}
#I 大胖子走迷宫
时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分
问题描述
小明是个大胖子,或者说是个大大胖子,如果说正常人占用 1 × 1 的面积,小明要占用 5 × 5 的面积 。由于小明太胖了,所以他行动起来很不方便 。当玩一些游戏时,小明相比小伙伴就吃亏很多 。
小明的朋友们制定了一个计划,帮助小明减肥 。计划的主要内容是带小明玩一些游戏,让小明在游戏中运动消耗脂肪 。走迷宫是计划中的重要环节 。
朋友们设计了一个迷宫,迷宫可以看成是一个由 n × n 个方阵组成的方阵,正常人每次占用方阵中 1 × 1 的区域,而小明要占用 5 × 5 的区域 。小明的位置定义为小明最正中的一个方格 。迷宫四周都有障碍物 。
为了方便小明,朋友们把迷宫的起点设置在了第 3 行第 3 列,终点设置在了第 n-2 行第 n-2 列 。
小明在时刻 0 出发,每单位时间可以向当前位置的上、下、左、右移动单位 1 的距离,也可以停留在原地不动 。小明走迷宫走得很辛苦,如果他在迷宫里面待的时间很长,则由于消耗了很多脂肪,他会在时刻 k 变成一个胖子,只占用 3 × 3 的区域 。如果待的时间更长,他会在时刻 2k 变成一个正常人,只占用 1 × 1 的区域 。注意,当小明变瘦时迷宫的起点和终点不变 。
请问,小明最少多长时间能走到迷宫的终点 。注意,小明走到终点时可能变瘦了也可能没有变瘦 。
输入格式
输入的第一行包含两个整数 n, k 。
接下来 n 行,每行一个由 n 个字符组成的字符串,字符为 + 表示为空地,
字符为 * 表示为阻碍物 。
输出格式
输出一个整数,表示答案 。
测试样例1
Input:9 5+++++++++++++++++++++++++++++++++++++++++++++***+*****+++++++++++++++++++++++++++Output:16