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

< i || g < j)) cnt++;}}}System.out.println(cnt);}}
没有具体读懂题目意思,但可以把它描述的限制全部加上,首先是 它们在同一行,同一列,或者在同一 45 度的斜线上 就是八个方位全覆盖到,再者 这两个字母从左向右看、或者从上向下看是递增的
完事
#C 平方拆分
本题总分:10 分
问题描述
将 2019 拆分为若干个两两不同的完全平方数之和,一共有多少种不同的方法?
注意交换顺序视为同一种方法,例如 132 + 252 + 352 = 2019 与 132 + 352 +252 = 2019 视为同一种方法 。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可 。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分 。
52574

public class Test {static int cnt;public static void main(String[] args) {dfs(2019, -1);System.out.println(cnt);}static void dfs(int num, int start) {if (num < 0) return;if (num == 0) cnt++;else for (int i = start + 1, high = (int)Math.sqrt(num); i <= high; i++)dfs(num - i * i, i);}}
如果保证拆分出的元素是递增的,那么拆分的方法是不会重复的
如果保证拆分出的元素是严格递增的,那么拆分的元素和方法都是不会重复的
这个道理在绝大多数情况下都适用
#D 切割
本题总分:10 分
问题描述
在 4 × 4 的方格矩阵中画一条直线 。则直线穿过的方格集合有多少种不同的可能?这个里直线穿过一个方格当且仅当直线将该方格分割成面积都大于 0 的两部分 。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可 。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分 。
不会

import java.util.*;public class Test {static final int size = 4;static final double precision = 0.01;static int[] HASH_TABLE = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53 };public static void main(String[] args) {Set set = new HashSet();List grid = new ArrayList();List top = new ArrayList(),left = new ArrayList(),right = new ArrayList(),bottom = new ArrayList();for (int i = 0; i <= size; i++) {grid.add(new Line(i, 0, i, size));grid.add(new Line(0, i, size, i));}for (double i = 0; i <= size; i += precision) {top.add(new Line.Point(i, size));left.add(new Line.Point(0, i));right.add(new Line.Point(size, i));bottom.add(new Line.Point(i, 0));}}static void calc(List side, List other, List grid, Set set) {int[][] cnt = new int[size + 2][size + 2];for (Line.Point A: side)for (Line.Point B: other) {clear(cnt);for (Line line: grid) {Line.Point point = Line.intersection(line, new Line(A, B));if (point == null) continue;// 不会}}}static void clear(int[][] a) {for (int i = a.length - 1; i >= 0; i--)Arrays.fill(a, 0);}static class Line {private Point A, B;public Line(Point A, Point B) {this.A = A;this.B = B;}public Line(double x1, double y1, double x2, double y2) {this.A = new Point(x1, y1);this.B = new Point(x2, y2);}static public Point intersection(Line line1, Line line2) {double A1 = line1.A.y - line1.B.y;double B1 = line1.B.x - line1.A.x;double A2 = line2.A.y - line2.B.y;double B2 = line2.B.x - line2.A.x;double det = A1 * B2 - A2 * B1;if (Math.abs(det) <= 1E-5) return null;double C1 = A1 * line1.A.x + B1 * line1.A.y;double C2 = A2 * line2.A.x + B2 * line2.A.y;double a = B2 / det;double b = -B1 / det;double c = -A2 / det;double d = A1 / det;return new Point(a * C1 + b * C2, c * C1 + d * C2);}public static class Point {double x, y;Point(double x, double y) {this.x = x;this.y = y;}public String toString() {return "Point{ x: " + x + ", y:" + y + " }";}}}}
人工枚举一个 char 的可能性,也不太现实