第三届蓝桥杯JAVA组C组国赛题解

闲话不多说,直接上代码!
1.【结果填空】 (满分11分)

看这个算式:

☆☆☆ + ☆☆☆ = ☆☆☆

如果每个五角星代表 1 ~ 9 的不同的数字。

这个算式有多少种可能的正确填写方法?

173 + 286 = 459
295 + 173 = 468
173 + 295 = 468
183 + 492 = 675

以上都是正确的填写法!

注意:
111 + 222 = 333 是错误的填写法!
因为每个数字必须是不同的! 
也就是说:1~9中的所有数字,每个必须出现且仅出现一次!

注意:
不包括数字“0”!

注意:
满足加法交换率的式子算两种不同的答案。
所以答案肯定是个偶数!

注意:
只要求计算不同的填法的数目
不要求列出所有填写法
更不要求填写源代码!

答案不要写在这里,请写在“解答.txt”中!

分析与解答:
国赛看到这种题目我是最开心的,因为这是一个很热门的知识点,全排列,全排列分好多种,这个题目简单在不用字典序输出,所以用交换法全排列就可以很轻松地搞定,当然如果考场上时间充裕的话可以套九层暴力循环,这个我在刚开始刷蓝桥杯的时候常用这招,如果一时忘了全排列模板怎么写可以用这个救命,但是要注意不要漏掉任何一个去重。

代码:

public class Main03JC01 {
	public static int ans=0;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a[]={1,2,3,4,5,6,7,8,9};
		dfs(0,a);
		System.out.println(ans);
	}
	public static void dfs(int k,int res[]){
		if(k==res.length){
			int a=res[0]*100+res[1]*10+res[2];
			int b=res[3]*100+res[4]*10+res[5];
			int c=res[6]*100+res[7]*10+res[8];
			if(a+b==c){
				ans++;
				return;
			}
			
		}
		for(int i=k;i<res.length;i++){
			int temp=res[i];
			res[i]=res[k];
			res[k]=temp;
			dfs(k+1,res);
			temp=res[i];
			res[i]=res[k];
			res[k]=temp;
		}
	}
}

答案:336

2.【代码填空】(满分12分)

/* 串“abcba”以字母“c”为中心左右对称;串“abba” 是另一种模式的左右对称。这两种情况我们都称这个串是镜像串。特别地,只含有1个字母的串,可以看成是第一种模式的镜像串。 

    一个串可以含有许多镜像子串。我们的目标是求一个串的最大镜像子串(最长的镜像子串),如果有多个最大镜像子串,对称中心靠左的优先选中。例如:“abcdeefghhgfeiieje444k444lmn”的最大镜像子串是:“efghhgfe”

    下面的静态方法实现了该功能,请仔细阅读并分析代码,填写空白处的代码,使得程序的逻辑合理,结果正确。
*/
// 求最大(长度最大)镜像对称子串
public static String getMaxMirrorString(String s)
{
	String max_s = "";  // 所求的最大对称子串

	for(int i=0; i<s.length(); i++)//遍历整个字符串,这个思路是暴力枚举吧,每一个字母都这样从头开始来一遍
	{
		// 第一种对称模式  这里应该是遍历偶数长度的子串
		int step = 1;
		try{
			for(;;)
			{
				if(s.charAt(i-step) != s.charAt(i+step)) break;
				step++;
			}
		}catch(Exception e){}
		
		String s1 = s.substring(_____________________________);     // 填空1
		
		// 第二种对称模式
		step = 0;
		try{
			for(;;)
			{
				if(_________________________________) break;    // 填空2
				step++;
			}
		}catch(Exception e){}
		
		String s2 = s.substring(i-step+1,i+step+1);
		
		
		if(s1.length() > max_s.length()) max_s = s1;
		if(s2.length() > max_s.length()) max_s = s2;
	}
	
	return max_s;				
}

【注意】
只填写缺少的部分,不要抄写已有的代码。
所填写代码不超过1条语句(句中不会含有分号)
所填代码长度不超过256个字符。
答案写在“解答.txt”中,不要写在这里!

分析与解答:
(1)
这里有个考点,我一开始做到这道题有点蒙,要熟悉这个考点才行,其实就是提取这个字符串,不难的
substring() 方法返回字符串的子字符串。
beginIndex – 起始索引(包括), 索引从 0 开始。
endIndex – 结束索引(不包括)。
(2)
第二个点也是一样的思路,注意奇数就行了,上下对称的很容易想到

参考答案:
i-step+1, i+step
s.charAt(i-step) != s.charAt(i+step+1)

3.【编程题】(满分18分)

某少年宫引进了一批机器人小车。可以接受预先输入的指令,按指令行动。小车的基本动作很简单,只有3种:左转(记为L),右转(记为R),向前走若干厘米(直接记数字)。

例如,我们可以对小车输入如下的指令:

15L10R5LRR10R20

则,小车先直行15厘米,左转,再走10厘米,再右转,...

不难看出,对于此指令串,小车又回到了出发地。

你的任务是:编写程序,由用户输入指令,程序输出每条指令执行后小车位置与指令执行前小车位置的直线距离。

【输入、输出格式要求】

用户先输入一个整数n(n<100),表示接下来将有n条指令。

接下来输入n条指令。每条指令只由L、R和数字组成(数字是0~100之间的整数)

每条指令的长度不超过256个字符。

程序则输出n行结果。

每条结果表示小车执行相应的指令前后位置的直线距离。要求四舍五入到小数后2位。

例如:用户输入:

5
L100R50R10
3LLL5RR4L12
LL
100R
5L5L5L5

则程序输出:

102.96
9.06
0.00
100.00
0.00

【注意】

请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!

请把所有类写在同一个文件中,调试好后,存入与【考生文件夹】下对应题号的“解答.txt”中即可。

相关的工程文件不要拷入。

请不要使用package语句。

源程序中只能出现JDK1.5中允许的语法或调用。不能使用1.6或更高版本。 

分析与解答:
这道题是模拟题,和省赛那道兰顿蚂蚁有点像,不过兰顿蚂蚁简单在不用处理字符串,这道题有一个难点是处理字符串,可以用substring方法,如果对substring方法不熟练,就是用逐个相乘的的办法,还算简单,需要有耐心,处理好方向和前进两条路就可以了。

代码:

public class Main03JC03 {
	public static String left="ULDR";
	public static String right="URDL";
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan=new Scanner(System.in);
		int n=scan.nextInt();
		scan.nextLine();
		for(int i=0;i<n;i++){
			String a=scan.nextLine();
			double res=getResult(a,0,0);
			System.out.printf("%.2f",res);
			System.out.println();
		}
		
	}
	private static double getResult(String a, int x, int y) {
		// TODO Auto-generated method stub
		String turn="U";
		for(int i=0;i<a.length();i++){
			char order=a.charAt(i);
		//	System.out.print(order);
		//	int end=i;
			
			if(order>='0'&&order<='9'){
				int t=order-'0';
			//	System.out.println("method1");
			while(i<a.length()-1&&(a.charAt(i+1)>='0'&&a.charAt(i+1)<='9')){
				t=t*10+(a.charAt(i+1)-'0');
				i++;
			}
			//System.out.print(t+" ");
				if(turn.equals("U")){
					x=x-t;
					t=0;
				}else if(turn.equals("L")){
					y=y-t;
					t=0;
				}else if(turn.equals("R")){
					y=y+t;
					t=0;
				}else if(turn.equals("D")){
					x=x+t;
					t=0;
				}
			}else{
			//	System.out.println("method2");
				if(order=='L'){
					if(turn.equals("U")){
						turn="L";
					}else if(turn.equals("L")){
						turn="D";
					}else if(turn.equals("D")){
						turn="R";
					}else if(turn.equals("R")){
						turn="U";
					}
				}else{
					if(turn.equals("U")){
						turn="R";
					}else if(turn.equals("R")){
						turn="D";
					}else if(turn.equals("D")){
						turn="L";
					}else if(turn.equals("L")){
						turn="U";
					}
				}
				//System.out.println(turn);
			}
		}
		return Math.sqrt(x*x+y*y);
	}
}

4.【编程题】(满分21分)

Excel是最常用的办公软件。每个单元格都有唯一的地址表示。比如:第12行第4列表示为:“D12”,第5行第255列表示为“IU5”。

事实上,Excel提供了两种地址表示方法,还有一种表示法叫做RC格式地址。 第12行第4列表示为:“R12C4”,第5行第255列表示为“R5C255”。

你的任务是:编写程序,实现从RC地址格式到常规地址格式的转换。

【输入、输出格式要求】

用户先输入一个整数n(n<100),表示接下来有n行输入数据。

接着输入的n行数据是RC格式的Excel单元格地址表示法。

程序则输出n行数据,每行是转换后的常规地址表示法。

例如:用户输入:

2
R12C4
R5C255

则程序应该输出:

D12
IU5

【注意】

请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!

请把所有类写在同一个文件中,调试好后,存入与【考生文件夹】下对应题号的“解答.txt”中即可。

相关的工程文件不要拷入。

请不要使用package语句。

源程序中只能出现JDK1.5中允许的语法或调用。不能使用1.6或更高版本。 

分析与解答:
我表示现在看到模拟EXECL编程题我都要哭了,做了不止一次几乎没做对过,表示当初省赛有一道题想了一个通宵愣是没想出来,这道题目还好比较简单,因为对应的标志比较鲜明,只要调试的时候凑好就可以了。

代码:

import java.util.Scanner;

public class Main03JC04 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan=new Scanner(System.in);
		int n=scan.nextInt();
		scan.nextLine();
		for(int i=0;i<n;i++){
			System.out.println(getResult(scan.nextLine()));
		}
	}

	private static String getResult(String a) {
		// TODO Auto-generated method stub
		String resNumber="";
		String resWord="";
		for(int i=0;i<a.length();i++){
			if(a.charAt(i)=='R'){
				int t=a.charAt(i+1)-'0';
				i++;
				while(i<a.length()-1&&(a.charAt(i+1)>='0'&&a.charAt(i+1)<='9')){
					t=t*10+a.charAt(i+1)-'0';
					i++;
				}
				resNumber=t+"";
			}else if(a.charAt(i)=='C'){
				int t=a.charAt(i+1)-'0';
				i++;
				while(i<a.length()-1&&(a.charAt(i+1)>='0'&&a.charAt(i+1)<='9')){
					t=t*10+a.charAt(i+1)-'0';
					i++;
				}
				resWord="";
				while(t>0){
					char res=(char) ('A'-1+t%26);
					t/=26;
					resWord=res+resWord;
				}
			}
		}
		return resWord+resNumber+"";
	}
	
}

5.【编程题】(满分34分)

某保密单位机要人员 A,B,C,D,E 每周需要工作5天,休息2天。

上级要求每个人每周的工作日和休息日安排必须是固定的,不能在周间变更。

此外,由于工作需要,还有如下要求:

1. 所有人的连续工作日不能多于3天(注意:周日连到下周一也是连续)。

2. 一周中,至少有3天所有人都是上班的。

3. 任何一天,必须保证 A B C D 中至少有2人上班。

4. B D E 在周日那天必须休息。

5. A E 周三必须上班。

6. A C 一周中必须至少有4天能见面(即同时上班)。

你的任务是:编写程序,列出ABCDE所有可能的一周排班情况。工作日记为1,休息日记为0

A B C D E 每人占用1行记录,从星期一开始。

【输入、输出格式要求】

程序没有输入,要求输出所有可能的方案。

每个方案是7x5的矩阵。只有1和0组成。        

矩阵中的列表示星期几,从星期一开始。

矩阵的行分别表示A,B,C,D,E的作息时间表。

多个矩阵间用空行分隔开。

例如,如下的矩阵就是一个合格的解。请编程输出所有解(多个解的前后顺序不重要)。

0110111
1101110
0110111
1101110
1110110

【注意】

请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!

请把所有类写在同一个文件中,调试好后,存入与【考生文件夹】下对应题号的“解答.txt”中即可。

相关的工程文件不要拷入。

请不要使用package语句。

源程序中只能出现JDK1.5中允许的语法或调用。不能使用1.6或更高版本。 

分析与解答:
待更新:

代码:
待更新:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值