蓝桥杯2014Java_A组
1.猜年龄
标题:猜年龄
小明带两个妹妹参加元宵灯会。别人问她们多大了,她们调皮地说:“我们俩的年龄之积是年龄之和的6倍”。小明又补充说:“她们可不是双胞胎,年龄差肯定也不超过8岁啊。”
请你写出:小明的较小的妹妹的年龄。
注意: 只写一个人的年龄数字,请通过浏览器提交答案。不要书写任何多余的内容。
答案:10
注:我们俩的年龄之积是年龄之和的6倍
年龄差肯定也不超过8岁啊
public class _01猜年龄 {
/**
* @param args
*/
public static void main(String[] args) {
//年龄可能不大,所以1枚举到20,试试
for(int i = 1 ; i < 20 ; i++){
for(int j = 1 ; j < 20 ; j++){
if(i < j && i*j == (i+j)*6){
System.out.println(i+" " + j);
}
}
}
}
}
2.李白打酒
标题:李白打酒
话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。
/*
* 酒壶中有酒2斗
* 逢店加一倍,遇花喝一斗。
* 最后一次遇到的是花
*
* 答案:14
*/
public class _02李白打酒 {
static int ans;
public static void main(String[] args) {
f(5, 9, 2); // 花5,酒从9开始因为最后一次遇到花 , 酒2斗
System.out.println(ans);
}
/**
*
* @param dian
* 店
* @param huan
* 花
* @param jiu
* 酒
* @return
*/
private static void f(int dian, int huan, int jiu) {
if(dian == 0 && huan == 0 && jiu == 1){ //最后酒要剩1斗,因为最后是遇到花
ans++;
}
if (dian > 0){
f(dian - 1, huan, jiu * 2); // 遇店加一倍
}
if (huan > 0){
f(dian, huan - 1, jiu - 1); // 遇花喝一斗,就是减1
}
}
}
3.神奇算式
标题:神奇算式
由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。
比如:
210 x 6 = 1260
8 x 473 = 3784
27 x 81 = 2187
都符合要求。
如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。
请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。
//答案:12
public class _03神奇算式 {
/**
* @param args
*/
static int ans;
public static void main(String[] args) {
for(int i = 1 ; i < 10 ; i++){ //第一位数不0,所以从1开始
for(int j = 0 ; j < 10 ; j++){
if(i != j) //4个不同的数字,组成
for(int k = 0 ; k < 10 ; k++){
if(i!= j && i != k)
for(int l = 0 ; l < 10 ; l++){
if(i != j && i != k && i != l){
int src = i * 1000 + j * 100 + k *10+l; //ijkl四位数
//验证
if(j!=0){
int r1 = i*(j*100+k*10+l); //乘法维埃里
if(check(src , r1)){
System.out.printf("%d * %d\n", i ,(j*100+k*10+l));
ans++;
}
}
//验证
if(k != 0){
int r2 = (i*10+j) *(k*10+l);
if((i * 10 + j) < (k * 10 + l) && check(src , r2) ){
System.out.printf("%d * %d\n",(i*10+j),(k*10+l));
ans++;
}
}
}
}
}
}
}
System.out.println(ans);
}
private static boolean check(int src , int r2){
String s1 = String.valueOf(src); //把整数转换成 字符串
String s2 = String.valueOf(r2);
char[] chars1 = s1.toCharArray(); //把字符串转成字符数组,用于排序和比较
char[] chars2 = s2.toCharArray();
Arrays.sort(chars1); //排序
Arrays.sort(chars2);
//在两个字符比较是要用于 .equals()
return new String(chars1).equals(new String(chars2));
}
}
6.六角填数
/*
标题:六角填数
如图【1.png】所示六角形中,填入1~12的数字。
使得每条直线上的数字之和都相同。
图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?
请通过浏览器提交答案,不要填写多余的内容。*/
public class _06六角填数 {
/**
* @param args
*/
static int[] arr = {2,4,5,6,7,9,10,11,12}; //因为以有1,3,8
public static void main(String[] args) {
f(0);
}
//全排
private static void f(int k){
if(k == 9){
check();
return; //结果
}
for(int i = k ; i < 9 ; i++){
int t = arr[k];
arr[k] = arr[i];
arr[i] = t;
f(k + 1);
t = arr[k];
arr[k] = arr[i];
arr[i] = t;
}
}
private static void check(){
//r1 , r2 像 ^
int r1 = 1 + arr[0] + arr[3] + arr[5]; //第一条边,左斜
int r2 = 1 + arr[1] + arr[4] + arr[8]; //第二条边,右斜
int r3 = 8 + arr[0] + arr[1] + arr[2]; //第三条边,最上一直线
//r4 , r5 像 V
int r4 = 11 + arr[3] + arr[6]; //第四条边,左斜角边
int r5 = 3 + arr[2] + arr[4] + arr[7]; //第五条边,右斜角边
int r6 = arr[5] + arr[6] + arr[7] + arr[8];
//5条边是否相等
if(r1 == r2 && r2 == r3 &&r3 == r4 &&r4 == r5 && r5 == r6){
// for(int i = 0 ; i < 9 ; i++){ //用来检测
// System.out.println(arr[i] + " ");
// }
System.out.println(arr[3]); //这是答案
}
}
}
7.绳圈
标题:绳圈
今有 100 根绳子,当然会有 200 个绳头。
如果任意取绳头两两配对,把所有绳头都打结连接起来。最后会形成若干个绳圈(不考虑是否套在一起)。
我们的问题是:请计算最后将形成多少个绳圈的概率最大?
注意:结果是一个整数,请通过浏览器提交该数字。不要填写多余的内容。
*/
/*
c[i]表示i条绳的2i个端点配对的种数,有c[1]=1,c[i]=c[i-1]*(2i-1)——>
第i根绳子加入既有组合,对于i-1根绳子的每一种配对,有
A.(i-1)个对儿可以从任意一对儿拆开将新绳子接入而且接入方法有两种,这是2(i-1)种接入方法
B.或者自己成一对儿不影响原有配对,这是1种接入方法
因此c[i]有c[i-1]*(2i-1)种配对方法
设f[i][j]表示i条绳结成j个圈的概率,
于是有f[i][i]=1/c[i]——>f[i][i]表示i根绳i个圈,只有一种配对方法,而全部配对方法为c[i]
f[i][1]=f[i-1][1]*c[i-1]*(i-1)*2/c[i],——>i根绳1个圈的概率=i-1根绳子围成1个圈的概率*总数 (即配对数)
有(i-1)个地方可以断开接入 得出配对数,然后除以总数得概率
进一步f[i][j]=(f[i-1][j]*c[i-1]*(i-1)*2+f[i-1][j-1]*c[i-1])/c[i],
情况1:维持j个圈,有i-1个地方可以断开将新绳子接入f[i-1][j]*c[i-1]*(i-1)*2
情况2:i-1根绳子组成j-1个圈,新绳子自成一圈
两种情况相加➗总数得出概率
再根据c[i]和c[i-1]的递推关系将c[i]和c[i-1]约去得到:f[i][j]=(f[i-1][j]*(i-1)*2+f[i-1][j-1])/(2i-1)
public class _07绳圈 {
/**
* @param args
*/
public static void main(String[] args) {
double f[][] = new double[101][101];
f[1][1] = 1;
for (int sheng = 2; sheng <= 100; sheng++) {
f[sheng][1] = f[sheng - 1][1] * (sheng - 1) * 2 / (2 * sheng - 1);
for (int quan = 2; quan <= sheng; quan++) {
f[sheng][quan] = (f[sheng - 1][quan] * (sheng - 1) * 2 + f[sheng - 1][quan - 1])/ (2 * sheng - 1);
}
}
double max = -1;
int ans = -1;
for (int i = 1; i <= 100; i++) {
if (f[100][i] > max) {
max = f[100][i];
ans = i;
}
}
System.out.println(ans);
}
}
8.兰顿蚂蚁
/*
标题:兰顿蚂蚁
兰顿蚂蚁,是于1986年,由克里斯·兰顿提出来的,属于细胞自动机的一种。
平面上的正方形格子被填上黑色或白色。在其中一格正方形内有一只“蚂蚁”。
蚂蚁的头部朝向为:上下左右其中一方。
蚂蚁的移动规则十分简单:
若蚂蚁在黑格,右转90度,将该格改为白格,并向前移一格;
若蚂蚁在白格,左转90度,将该格改为黑格,并向前移一格。
规则虽然简单,蚂蚁的行为却十分复杂。刚刚开始时留下的路线都会有接近对称,像是会重复,但不论起始状态如何,蚂蚁经过漫长的混乱活动后,会开辟出一条规则的“高速公路”。
蚂蚁的路线是很难事先预测的。
你的任务是根据初始状态,用计算机模拟兰顿蚂蚁在第n步行走后所处的位置。
【数据格式】
输入数据的第一行是 m n 两个整数(3 < m, n < 100),表示正方形格子的行数和列数。
接下来是 m 行数据。
每行数据为 n 个被空格分开的数字。0 表示白格,1 表示黑格。
接下来是一行数据:x y s k, 其中x y为整数,表示蚂蚁所在行号和列号(行号从上到下增长,列号从左到右增长,都是从0开始编号)。
s 是一个大写字母,表示蚂蚁头的朝向,我们约定:上下左右分别用:UDLR表示。k 表示蚂蚁走的步数。
输出数据为两个空格分开的整数 p q, 分别表示蚂蚁在k步后,所处格子的行号和列号。
例如, 输入:
5 6
0 0 0 0 0 0
0 0 0 0 0 0
0 0 1 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
2 3 L 5
程序应该输出:
1 3
再例如, 输入:
3 3
0 0 0
1 1 1
1 1 1
1 1 U 6
程序应该输出:
0 0
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
*/
public class _08兰顿蚂蚁 {
/**
* @param args
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int n = sc.nextInt();
int[][] g = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
g[i][j] = sc.nextInt();
}
}
// x,y起始的位置
int x = sc.nextInt();
int y = sc.nextInt();
String s = sc.next(); // 字母代表方向
int d = getD(s); // 方向
int k = sc.nextInt(); // 步数
int step = 0;
while(true){
// 若蚂蚁在黑格,右转90度,将该改为白格,并向前移一格
if (g[x][y] == 1) {
d = d % 4 + 1; //技巧
g[x][y] = 0; //走过变为0
} else {// 若蚂蚁在白格,左转90度,将该格改为黑格,并向前移一格
d--;
if (d == 0)
d = 4;
g[x][y] = 1;
}
//前进一步
if(d == 1) x--; //上
if(d == 2) y++; //右
if(d == 3) x++; //下
if(d == 4) y--; //左
step++; //步数加1
if(step == k){ //如果等于输入要走的步数,输出当前位置(结果)
System.out.println(x + " " + y);
break;
}
}
}
static int getD(String s) {
// UDLR 上下左右
if (s.equals("U")) // 上
return 1;
if (s.equals("R")) // 右
return 2;
if (s.equals("D")) // 下
return 3;
if (s.equals("L")) // 左
return 4;
return 0;
}
}