第一题 国王的遗产
X国是个小国。国王K有6个儿子。在临终前,K国王立下遗嘱:国王的一批牛作为遗产要分给他的6个儿子。
其中,大儿子分1/4,二儿子1/5,三儿子1/6,....
直到小儿子分1/9。
牛是活的,不能把一头牛切开分。
最后还剩下11头牛,分给管家。
请计算国王这批遗产中一共有多少头牛。
这是一个整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性的文字)
1 // 国王的遗产
2
3 public class t1 {
4
5 public static void main(String[] args) {
6
7 for (int i &#61; 12; i <&#61; 10000; i&#43;&#43;) {
8 if (i % 4 &#61;&#61; 0 && i % 5 &#61;&#61; 0 && i % 6 &#61;&#61; 0 && i % 7 &#61;&#61; 0 && i % 8 &#61;&#61; 0 && i % 9 &#61;&#61; 0) {
9 if (i - i / 4 - i / 5 - i / 6 - i / 7 - i / 8 - i / 9 &#61;&#61; 11) {
10 System.out.println(i);
11 }
12 }
13 }
14 // answer: 2520
15
16 // 验算
17 System.out.println(
18 2520 / 4 &#43; " " &#43; 2520 / 5 &#43; " " &#43; 2520 / 6 &#43; " " &#43; 2520 / 7 &#43; " " &#43; 2520 / 8 &#43; " " &#43; 2520 / 9);
19 int res &#61; 2520 - 2520 / 4 - 2520 / 5 - 2520 / 6 - 2520 / 7 - 2520 / 8 - 2520 / 9;
20 System.out.println(res);
21 }
22
23 }
第二题 六角幻方
把 1 2 3 ... 19 共19个整数排列成六角形状&#xff0c;如下&#xff1a;
* * *
* * * *
* * * * *
* * * *
* * *
要求每个直线上的数字之和必须相等。共有15条直线哦&#xff01;
再给点线索吧&#xff01;我们预先填好了2个数字&#xff0c;第一行的头两个数字是&#xff1a;15 13&#xff0c;参见图【p1.png】&#xff0c;黄色一行为所求
请你填写出中间一行的5个数字。数字间用空格分开。
这是一行用空格分开的整数&#xff0c;请通过浏览器提交答案&#xff0c;不要填写任何多余的内容&#xff08;比如说明性的文字等&#xff09;
解决思路&#xff1a;DFS
1 // 六角幻方
2 // 每一行的和应该是38 (1到19的和是190&#xff0c;190/5&#61;38)
3
4 public class t2 {
5
6 public static boolean[] vis &#61; new boolean[20];
7 public static int[] a &#61; new int[20];
8
9 public static void dfs(int x) {
10 // 剪枝
11 if (x &#61;&#61; 8) {
12 if (a[4] &#43; a[5] &#43; a[6] &#43; a[7] !&#61; 38)
13 return;
14 }
15 if (x &#61;&#61; 9) {
16 if (15 &#43; a[4] &#43; a[8] !&#61; 38)
17 return;
18 }
19 if (x &#61;&#61; 13) {
20 if (a[8] &#43; a[9] &#43; a[10] &#43; a[11] &#43; a[12] !&#61; 38)
21 return;
22 if (a[3] &#43; a[7] &#43; a[12] !&#61; 38)
23 return;
24 }
25 if (x &#61;&#61; 14) {
26 if (38 !&#61; 13 &#43; a[5] &#43; a[9] &#43; a[13])
27 return;
28 }
29 if (x &#61;&#61; 17) {
30 if (13 &#43; a[6] &#43; a[11] &#43; a[16] !&#61; 38 || a[13] &#43; a[14] &#43; a[15] &#43; a[16] !&#61; 38)
31 return;
32 }
33 if (x &#61;&#61; 18) {
34 if (a[3] &#43; a[6] &#43; a[10] &#43; a[14] &#43; a[17] !&#61; 38 || a[8] &#43; a[13] &#43; a[17] !&#61; 38)
35 return;
36 }
37 if (x &#61;&#61; 19) {
38 if (a[7] &#43; a[11] &#43; a[15] &#43; a[18] !&#61; 38 || a[4] &#43; a[9] &#43; a[14] &#43; a[18] !&#61; 38)
39 return;
40 }
41 if (x &#61;&#61; 20) {
42 // 最后出口
43 if (a[17] &#43; a[18] &#43; a[19] &#61;&#61; 38) {
44 System.out.println(a[8] &#43; " " &#43; a[9] &#43; " " &#43; a[10] &#43; " " &#43; a[11] &#43; " " &#43; a[12]);
45 // answer: 9 6 5 2 16
46 return;
47 }
48 }
49 for (int i &#61; 1; i <20; i&#43;&#43;) {
50 if (!vis[i]) {
51 vis[i] &#61; true;
52 a[x] &#61; i;
53 dfs(x &#43; 1);
54 vis[i] &#61; false;
55 }
56 }
57 }
58
59 public static void main(String[] args) {
60
61 a[1] &#61; 15;
62 a[2] &#61; 13;
63 a[3] &#61; 10;
64 vis[15] &#61; vis[13] &#61; vis[10] &#61; true;
65 dfs(4);
66
67 }
68
69 }
第三题 格子放鸡蛋
1 X星球的母鸡很聪明。它们把蛋直接下在一个 N * N 的格子中&#xff0c;每个格子只能容纳一枚鸡蛋。它们有个习惯&#xff0c;要求&#xff1a;每行&#xff0c;每列&#xff0c;以及每个斜线上都不能有超过2个鸡蛋。如果要满足这些要求&#xff0c;母鸡最多能下多少蛋呢&#xff0c;有多少种摆放方法呢&#xff1f;
2
3
4 下面的程序解决了这个问题&#xff0c;请仔细分析程序逻辑&#xff0c;推断划线处缺少的代码。
5
6 public class A
7 {
8 static int max &#61; 0;
9 static int T &#61; 0;
10 static final int N &#61; 6;
11
12 // 只能在(r,c) 以及其右&#xff0c;其下放置
13 static void f(int[][] da, int r, int c)
14 {
15 if(r>&#61;N){
16 int n &#61; count(da);
17 if(n>max) {
18 max &#61; n;
19 T &#61; 0;
20 }
21 if(n&#61;&#61;max) T&#43;&#43;;
22 return;
23 }
24
25 //计算一下步放哪
26 int r_next &#61; r;
27 int c_next &#61; c &#43; 1;
28 if(c_next>&#61;N){
29 c_next &#61; 0;
30 r_next&#43;&#43;;
31 }
32
33 if(____________________){ // 填空位置
34 da[r][c] &#61; 1;
35 f(da, r_next, c_next);
36 }
37
38 da[r][c] &#61; 0;
39 f(da, r_next, c_next);
40 }
41
42 static int count(int[][] da)
43 {
44 int n &#61; 0;
45
46 for(int i&#61;0; i
47 for(int j&#61;0; j
48 if(da[i][j]&#61;&#61;1) n&#43;&#43;;
49
50 return n;
51 }
52
53 static int spy(int[][] da, int r, int c)
54 {
55 int m&#61;0;
56
57 // 该行
58 int n&#61;0;
59 for(int i&#61;0; i
60 if(n>m) m &#61; n;
61
62 //该列
63 n&#61;0;
64 for(int i&#61;0; i
65 if(n>m) m &#61; n;
66
67 //右斜线
68 n&#61;0;
69 for(int i&#61;0; i
70 if(r-i<0 || c-i<0) break;
71 if(da[r-i][c-i]&#61;&#61;1) n&#43;&#43;;
72 }
73 for(int i&#61;1; i
74 if(r&#43;i>&#61;N || c&#43;i>&#61;N) break;
75 if(da[r&#43;i][c&#43;i]&#61;&#61;1) n&#43;&#43;;
76 }
77 if(n>m) m &#61; n;
78
79 //左斜线
80 n&#61;0;
81 for(int i&#61;0; i
82 if(r-i<0 || c&#43;i>&#61;N) break;
83 if(da[r-i][c&#43;i]&#61;&#61;1) n&#43;&#43;;
84 }
85 for(int i&#61;1; i
86 if(r&#43;i>&#61;N || c-i<0) break;
87 if(da[r&#43;i][c-i]&#61;&#61;1) n&#43;&#43;;
88 }
89 if(n > m) m &#61; n;
90
91 return m;
92 }
93
94 public static void main(String[] args)
95 {
96 int[][] da &#61; new int[N][N];
97
98 f(da, 0, 0);
99
100 System.out.println(max);
101 System.out.println(T);
102 }
103 }
104
105 注意&#xff1a;通过浏览器提交答案。只填写缺少的内容&#xff0c;不要填写任何多余的内容&#xff08;例如&#xff1a;说明性文字或已有符号&#xff09;。
解决思路&#xff1a;经典算法N皇后问题的变体&#xff0c;读完题可以知道大概是要根据spy函数的调用结果来判断
1 public class t3 {
2
3 static int max &#61; 0;
4 static int T &#61; 0;
5 static final int N &#61; 6;
6
7 // 只能在(r,c) 以及其右&#xff0c;其下放置
8 static void f(int[][] da, int r, int c) {
9 if (r >&#61; N) {
10 int n &#61; count(da);
11 if (n > max) {
12 max &#61; n;
13 T &#61; 0;
14 }
15 if (n &#61;&#61; max)
16 T&#43;&#43;;
17 return;
18 }
19
20 // 计算一下步放哪
21 int r_next &#61; r;
22 int c_next &#61; c &#43; 1;
23 if (c_next >&#61; N) {
24 c_next &#61; 0;
25 r_next&#43;&#43;;
26 }
27
28 if (spy(da, r, c) <2) { // 填空位置
29 da[r][c] &#61; 1;
30 f(da, r_next, c_next);
31 }
32
33 da[r][c] &#61; 0;
34 f(da, r_next, c_next);
35 }
36
37 static int count(int[][] da) {
38 int n &#61; 0;
39
40 for (int i &#61; 0; i
41 for (int j &#61; 0; j
42 if (da[i][j] &#61;&#61; 1)
43 n&#43;&#43;;
44
45 return n;
46 }
47
48 static int spy(int[][] da, int r, int c) {
49 int m &#61; 0;
50
51 // 该行
52 int n &#61; 0;
53 for (int i &#61; 0; i
54 if (da[r][i] &#61;&#61; 1)
55 n&#43;&#43;;
56 if (n > m)
57 m &#61; n;
58
59 // 该列
60 n &#61; 0;
61 for (int i &#61; 0; i
62 if (da[i][c] &#61;&#61; 1)
63 n&#43;&#43;;
64 if (n > m)
65 m &#61; n;
66
67 // 右斜线
68 n &#61; 0;
69 for (int i &#61; 0; i
70 if (r - i <0 || c - i <0)
71 break;
72 if (da[r - i][c - i] &#61;&#61; 1)
73 n&#43;&#43;;
74 }
75 for (int i &#61; 1; i
76 if (r &#43; i >&#61; N || c &#43; i >&#61; N)
77 break;
78 if (da[r &#43; i][c &#43; i] &#61;&#61; 1)
79 n&#43;&#43;;
80 }
81 if (n > m)
82 m &#61; n;
83
84 // 左斜线
85 n &#61; 0;
86 for (int i &#61; 0; i
87 if (r - i <0 || c &#43; i >&#61; N)
88 break;
89 if (da[r - i][c &#43; i] &#61;&#61; 1)
90 n&#43;&#43;;
91 }
92 for (int i &#61; 1; i
93 if (r &#43; i >&#61; N || c - i <0)
94 break;
95 if (da[r &#43; i][c - i] &#61;&#61; 1)
96 n&#43;&#43;;
97 }
98 if (n > m)
99 m &#61; n;
100
101 return m;
102 }
103
104 public static void main(String[] args) {
105 int[][] da &#61; new int[N][N];
106
107 f(da, 0, 0);
108
109 System.out.println(max);
110 System.out.println(T);
111 }
112
113 }