CCF历年真题源代码.zip

  • r5_562127
    了解作者
  • 29KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-06-09 03:22
    上传日期
13年12月至19年3月份全部真题第一二题源代码(基于java实现),我放在了记事本里,同学们自行复制到开发工具中即可,文件名为“1”的是第一题,文件名为“2”的是第二题,1、2题包含全部历年真题,3、4、5题各只整理了一个。所有代码经过模拟检验,均为满分。
CCF历年真题源代码.zip
  • CCF历年真题源代码
  • 4
  • 201312-4 有趣的数.txt
    1.4KB
  • 5
  • 201312-5 I‘m stack.txt
    4.5KB
  • 3
  • 201312-3 最大的矩形.txt
    1.3KB
  • 2
  • 201509-2日期计算.txt
    0B
  • 201903-2二十四点.txt
    2.7KB
  • 201503-2数字排序.txt
    1.5KB
  • 201803-2碰撞的小球.txt
    1.3KB
  • 201312-2 ISBN号码.txt
    1.9KB
  • 201709-2公共钥匙盒.txt
    0B
  • 201604-2俄罗斯方块.txt
    1.8KB
  • 201609-2火车购票.txt
    1.8KB
  • 201512-2 消除类游戏.txt
    2.3KB
  • 201712-2游戏.txt
    1.3KB
  • 201812-2小明放学.txt
    2KB
  • 201612-2工资计算.txt
    1.6KB
  • 201809-2买菜.txt
    836B
  • 201409-2画图.txt
    799B
  • 201412-2Z字型扫描.txt
    1.5KB
  • 201403-2窗口.txt
    2.2KB
  • 201703-2 学生排队.txt
    3.9KB
  • 1
  • 201712-1最小差值.txt
    1.3KB
  • 201703-1折点计数.txt
    1.2KB
  • 201512-1数位之和.txt
    710B
  • 201812-1小明上学.txt
    534B
  • 201803-1跳一跳.txt
    1.3KB
  • 201412-1门禁系统.txt
    1.1KB
  • 201703-1分蛋糕.txt
    839B
  • 201503-1图象旋转.txt
    801B
  • 201509-1数列分段.txt
    450B
  • 201409-1相邻数对.txt
    700B
  • 201809-1卖菜.txt
    1.4KB
  • 201609-1最大波动.txt
    638B
  • 201709-1打酱油.txt
    582B
  • 201903-1小中大.txt
    846B
  • 201412-1相反数.txt
    675B
  • 201312-1出现次数最多的数.txt
    997B
  • 201612-1中间数.txt
    1.5KB
内容介绍
试题编号: 201312-5 试题名称: I’m stuck! 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思:   '#': 任何时候玩家都不能移动到此方格;   '+': 当玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格;   '-': 当玩家到达这一方格后,下一步可以向左右两个方向相邻的一个非'#'方格移动一格;   '|': 当玩家到达这一方格后,下一步可以向上下两个方向相邻的一个非'#'方格移动一格;   '.': 当玩家到达这一方格后,下一步只能向下移动一格。如果下面相邻的方格为'#',则玩家不能再移动;   'S': 玩家的初始位置,地图中只会有一个初始位置。玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格;   'T': 玩家的目标位置,地图中只会有一个目标位置。玩家到达这一方格后,可以选择完成任务,也可以选择不完成任务继续移动。如果继续移动下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格。   此外,玩家不能移动出地图。   请找出满足下面两个性质的方格个数:   1. 玩家可以从初始位置移动到此方格;   2. 玩家不可以从此方格移动到目标位置。 输入格式   输入的第一行包括两个整数R 和C,分别表示地图的行和列数。(1 ≤ R, C ≤ 50)。   接下来的R行每行都包含C个字符。它们表示地图的格子。地图上恰好有一个'S'和一个'T'。 输出格式   如果玩家在初始位置就已经不能到达终点了,就输出“I'm stuck!”(不含双引号)。否则的话,输出满足性质的方格的个数。 样例输入 5 5 --+-+ ..|#. ..|## S-+-T ####. 样例输出 2 样例说明   如果把满足性质的方格在地图上用'X'标记出来的话,地图如下所示:   --+-+   ..|#X   ..|##   S-+-T   ####X import java.util.*; public class Main { public static void main(String[] args) { new Main().run(); } public void run() { Scanner fin = new Scanner(System.in); int R = fin.nextInt(); int C = fin.nextInt(); fin.nextLine(); int[][] board = new int[R + 2][C + 2]; int rowStart = 0, colStart = 0, rowEnd = 0, colEnd = 0; for (int i = 1; i <= R; ++i) { String line = fin.nextLine(); for (int j = 1; j <= C; ++j) { char c = line.charAt(j - 1); switch (c) { case '#': break; case '-': board[i][j] = 5; break; case '|': board[i][j] = 0xA; break; case '+': case 'S': case 'T': board[i][j] = 0xF; break; case '.': board[i][j] = 0x8; break; default: break; } if (c == 'S') { rowStart = i; colStart = j; } else if (c == 'T') { rowEnd = i; colEnd = j; } } } int[] dr = new int[] {0, -1, 0, 1}; int[] dc = new int[] {1, 0, -1, 0}; // Scan 1: find all cells which can reach T boolean[][] visited = new boolean[R + 2][C + 2]; boolean[][] canReachT = new boolean[R + 2][C + 2]; initVisited(visited); canReachT[rowEnd][colEnd] = true; visited[rowEnd][colEnd] = true; Queue<Integer> queue = new LinkedList<Integer>(); queue.add(rowEnd); queue.add(colEnd); while (!queue.isEmpty()) { int r = queue.remove(); int c = queue.remove(); for (int i = 0; i < 4; ++i) { int nr = r + dr[i]; int nc = c + dc[i]; if (visited[nr][nc]) continue; if ((board[nr][nc] & (1 << ((i + 2) % 4))) != 0) { canReachT[nr][nc] = true; queue.add(nr); queue.add(nc); visited[nr][nc] = true; } } } /* for (int i = 1; i <= R; ++i) { for (int j = 1; j <= C; ++j) { if (canReachT[i][j]) { System.out.println("i = " + i + ", j = " + j); } } } */ if (!canReachT[rowStart][colStart]) { System.out.println("I'm stuck!"); return; } // Scan 2: get result boolean[][] rCanReach = new boolean[R + 2][C + 2]; initVisited(visited); queue.clear(); visited[rowStart][colStart] = true; rCanReach[rowStart][colStart] = true; queue.add(rowStart); queue.add(colStart); while (!queue.isEmpty()) { int r = queue.remove(); int c = queue.remove(); for (int i = 0; i < 4; ++i) { if ((board[r][c] & (1 << i)) == 0) continue; int nr = r + dr[i]; int nc = c + dc[i]; if (visited[nr][nc]) continue; if (board[nr][nc] == 0) continue; rCanReach[nr][nc] = true; queue.add(nr); queue.add(nc); visited[nr][nc] = true; } } int result = 0; for (int i = 1; i <= R; ++i) { for (int j = 1; j <= C; ++j) { /* if (rCanReach[i][j]) { System.out.println("i = " + i + ", j = " + j); } */ if (rCanReach[i][j] && (!canReachT[i][j])) ++result; } } System.out.println(result); } private void initVisited(boolean[][] visited) { int R = visited.length - 2; int C = visited[0].length - 2; for (int i = 0; i <= R + 1; ++i) { visited[i][0] = true; visited[i][C + 1] = true; } for (int j = 0; j <= C + 1; ++j) { visited[0][j] = true; visited[R + 1][j] = true; } for (int i = 1; i <= R; ++i) { for (int j = 1; j <= C; ++j) { visited[i][j] = false; } } } }
评论
    相关推荐