蓝桥杯2014Java_A组题解

蓝桥杯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;
	}
}

发布了11 篇原创文章 · 获赞 0 · 访问量 130

猜你喜欢

转载自blog.csdn.net/qq_42847094/article/details/105178354