蓝桥杯-决赛C组第三届java

目录

第1题 填算式

第2题 提取子串

第3题 机器人行走

第4题 地址格式转换

第5题 排日程


第1题 填算式


【结果填空】 (满分11分)

    看这个算式:
 
    ☆☆☆ + ☆☆☆ = ☆☆☆

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

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

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

    以上都是正确的填写法!

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

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

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

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

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


336

思路:把1-9数字全排列,然后判断是否满足等式。这里我用的递归全排列

声明一个长度为9的数组分别代表一颗星      ☆☆☆ + ☆☆☆ = ☆☆☆

 public class Main {

	public static int [] a = new int [9];
	public static boolean [] b = new boolean [10];
	public static int count = 0;
	
	public static void main(String[] args) {
		dfs(1);
		System.out.println(count);
	}
	
//	递归把9个数依次赋值
	public static void dfs(int m){//1-9
		if(m==10){
			show();
			return;
		}
		for(int i=0;i<9;i++){
			if(!b[i]){
				b[i] = true;
				a[i] = m;//把这个数赋值给这颗星
				dfs(m+1);
				b[i] = false;
			}
		}
	}
	
	/**
	 * 如果满足等式 count++
	 */
	public static void show(){
		if((a[0]*100+a[1]*10+a[2])+(a[3]*100+a[4]*10+a[5])==(a[6]*100+a[7]*10+a[8])){
//			System.out.println((a[0]*100+a[1]*10+a[2])+"+"+(a[3]*100+a[4]*10+a[5])+"="+(a[6]*100+a[7]*10+a[8]));
			count++;
		}
	}
}
//336

第2题 提取子串


【代码填空】(满分16分)
    
    串“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”中,不要写在这里!


i-step+1, i+step
s.charAt(i-step) != s.charAt(i+step+1)

思路:观察代码全局,从上下可以看出代码中有相像的地方,代入然后再改改就好了

public class Main {

	public static void main(String[] args) {
		
		String a = "abcdeefghhgfeiieje444k444lmn";
		System.out.println(getMaxMirrorString(a));
	}
	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(i-step+1,i+step);     // 填空1
			
//			abcdeefghhgfeiieje444k444lmn
			// 第二种对称模式
			step = 0;
			try{
				for(;;)
				{
					if(s.charAt(i-step)!=s.charAt(i+step+1)) 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;				
	}
}
//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或更高版本。 

思路:输入的字符串一个字符一个字符去判断是不是数字,不是就改变方向,想象一下一个坐标系,

计算出行走后的宽和高,然后根据勾股定理算出距离。输出的时候记得是保存两位小数并且

四舍五入,用String.format("%.2f", show(r[i]));比较方便。

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n =  in.nextInt();
		String [] r = new String [n];
		for(int i=0;i<n;i++){
			r[i] = in.next();
		}
		for(int i=0;i<n;i++){
			System.out.println(String.format("%.2f", show(r[i])));
		}
	}
	public static double show(String a){
		int width = 0;
		int high = 0;
		int c = 0;//距离
		int d = 0;//当前状态,0右 1 上 2左 3 下
		for(int i=0;i<a.length();i++){
			if((int)(a.charAt(i))-48>=0&&(int)a.charAt(i)-48<=9){
				int c1 = (int)(a.charAt(i))-48;
				c = (int)(c)*10+(int)(c1);
			}else if(a.charAt(i)=='L'){
				if(d==0){
					width+=c;
				}else if(d==1){
					high+=c;
				}else if(d==2){
					width-=c;
				}else if(d==3){
					high-=c;
				}
				if(d==0){
					d=1;
				}else if(d==1){
					d=2;
				}else if(d==2){
					d=3;
				}else if(d==3){
					d=0;
				}
				c = 0;
			}else if(a.charAt(i)=='R'){
				if(d==0){
					width+=c;
				}else if(d==1){
					high+=c;
				}else if(d==2){
					width-=c;
				}else if(d==3){
					high-=c;
				}
				if(d==0){
					d=3;
				}else if(d==1){
					d=0;
				}else if(d==2){
					d=1;
				}else if(d==3){
					d=2;
				}
				
				c = 0;
			}
			if(i==a.length()-1){
				if(d==0){
					width+=c;
				}else if(d==1){
					high+=c;
				}else if(d==2){
					width-=c;
				}else if(d==3){
					high-=c;
				}
			}
		}
		if(width==0){
			return Math.abs(high);
		}
		if(high==0){
			return Math.abs(width);
		}
		return Math.sqrt((high*high+width*width));
	}
}

第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或更高版本。 

思路:(字符处理)由题上例子可以看出行不变,列上的数字转换为大写字母。R12C4==D12 , R5C255==IU5

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		String [] a = new String [n];
		for(int i=0;i<n;i++){
			a[i] = in.next();
		}
		for(int i=0;i<n;i++){
			System.out.println(show(a[i]));
		}
	}
	public static String show(String a){
		int c = a.indexOf("C");
		int row = Integer.parseInt(a.substring(1,c));//R
		int col = Integer.parseInt(a.substring(c+1));//C
		String num = "";
		while(col>0){
			if(col%26==0){
				num+=(char)(26+64);
				col-=26;
				col=col/26;
			}else{
				num+=(char)(col%26+64);
				col=col/26;
			}
		}
		String t = row+"";
		String num1 = "";
		for(int i=num.length();i>0;i--){
			num1+=num.substring(i-1,i);
		}
		num1=num1+t;
		return num1;
	}
}

第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或更高版本。 

思路:根据题中的条件,先列举所有情况,然后一个一个的排除,剩下的就是想要的结果。主要是观察出其规律

下面代码来自CSDN weixin_33766805https://blog.csdn.net/weixin_33766805/article/details/86305306

public class Main {

	public static int [][] types = new int [7][7];
	public static void main(String[] args) {
		int count = 0;
		for(int i=0;i<7;i++){
			count = (i+4)%7;
			for(int j=0;j<7;j++){
				if(j==count||i==j){
					types[i][j] = 0;
				}else{
					types[i][j] = 1;
				}
			}
		}
		for(int a = 0;a<7;a++){
			if(types[a][2]==0){
				continue;
			}
			for(int b = 0;b<7;b++){
				if(types[b][6]==1){
					continue;
				}
				for(int c = 0;c<7;c++){
					// A C 一周中必须至少有4天能见面(即同时上班)
					if(!AC(a,c)){
						continue;
					}
					for(int d = 0;d<7;d++){
						if(types[d][6]==1){
							continue;
						}
						//任何一天,必须保证ABCD中至少有2人上班
                        if(!ABCD(a, b, c, d)){
                        	continue;
                        }
						for(int e = 0;e<7;e++){
							if(types[e][2]==0||types[e][6]==1){
								continue;
							}
							// 一周中,至少有3天所有人都是上班的
                            if(!All(a, b, c, d, e)){
                            	continue;
                            }
                            print(a, b, c, d, e);
						}
					}
				}
			}
		}
	}
	
	//判断一周中是否A,C至少有4天能见面
    public static boolean AC(int a,int c){
        int days=0;
        for(int i=0;i<7;i++){
            if(types[a][i]+types[c][i]==2){
            	days++;
            }
        }
        return days>=4;
    }
  //判断ABCD每天是否至少有2人上班,是返回true,否返回false
    public static boolean ABCD(int a,int b,int c,int d){
        for(int i=0;i<7;i++){
            if(types[a][i]+types[b][i]+types[c][i]+types[d][i]<2){
            	return false;
            }
        }
        return true;
    }
  //判断一周中是否至少有3天所有人都是上班的
    public static boolean All(int a,int b,int c,int d,int e){
        int days=0;
        for(int i=0;i<7;i++){
            if(types[a][i]+types[b][i]+types[c][i]+types[d][i]+types[e][i]==5){
            	days++;
            }
        }
        return days>=3;
    }
	//打印结果
    public static void print(int a,int b,int c,int d,int e){
        for(int i=0;i<7;i++){
        	System.out.print(types[a][i]);
        }
        System.out.println();
        for(int i=0;i<7;i++){
        	System.out.print(types[b][i]);
        }
        System.out.println();
        for(int i=0;i<7;i++){
        	System.out.print(types[c][i]);
        }
        System.out.println();
        for(int i=0;i<7;i++){
        	System.out.print(types[d][i]);
        }
        System.out.println();
        for(int i=0;i<7;i++){
        	System.out.print(types[e][i]);
        }
        System.out.println();
        System.out.println();
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萤火的微亮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值