2011年华为杯校园编程大赛

本文介绍三种编程挑战:矩阵转置、出圈问题及公交站寻址算法。涉及矩阵操作、循环与条件判断等核心技能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 矩阵转置(20分)


问题描述: 
将一个N*N矩阵的行列互换。


要求实现函数: 
public String matrixTranspose (String inArr, int n)


【输入】inArr:       输入的字符矩阵


         n:          N*N矩阵的行数


【返回】转置后的字符矩阵




注:


输入输出的矩阵都是以一维形式保存的二维数组,比如输入为" 1, 2, 3, 4, 5, 6, 7, 8, 9",实际上表示如下3*3的矩阵:


1,2,3,


4,5,6,


7,8,9


示例 
输入InArr =  "1, 2, 3, 4, 5, 6, 7, 8, 9 ",n=3


返回:"1,4,7,2,5,8,3,6,9"

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;
public class Main {

	public static void main(String[] args) {
		 Scanner sc = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
         int a=sc.nextInt();//矩阵a的行数
         int s[]=new int[a*a];//一维数组s存放矩阵
         int sout[]=new int[a*a];
         int s1[][]=new int[a][a];//二维数组存放矩阵
         
         for(int i=0;i<a*a;i++)
         {
        	 s[i]=sc.nextInt();
         }
         //将矩阵一维数组转换为二维数组存放
         for(int m=0;m<a;m++)
         {
        	 for(int n=0;n<a;n++)
        	 {
        		 s1[m][n]=s[a*m+n];
        	 }
         }
         for(int m=0;m<a;m++)
         {
        	 for(int n=0;n<a;n++)
        	 {
        		 sout[a*m+n]=s1[n][m];
        		 System.out.print(sout[a*m+n]+" ");
        		
        	 }
        	 
         }
		 } 
	}


2. 出圈问题(30分)


问题描述: 
M个人围成一圈报数,数到N(1<N<10)的倍数或包含N这个数字时出圈,问剩下的最后一个人在原来的位置是多少?


报数规则


1、从第一个人开始报数为1,下一个人报数为上一个人报数加1


2、报数的最大值为2000,如果报数超过2000,则下一个人重新从1开始报数


要求实现方法: 
public String outFunc(int iTotalNum, int iKey)


【输入】iTotalNum:开始报数前的总人数, 0<iTotalNum<65535


        iKey:     题目中要求的数目N


【输出】无


【返回】剩下的人的原来的位置


示例 
输入:iTotalNum =5,  iKey =3


返回:"4"



输入:iTotalNum =15,  iKey =3


返回:"10"

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;
public class Main {

	public static void main(String[] args) {
		 Scanner sc = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
		 System.out.println("请输入总人数和N");
		 int sum=sc.nextInt();//总人数
         int num=sum;
         int N=sc.nextInt();//题目要求的N
         int count=0;//计算能被N整除以及含有N的数的个数
        	 for(int i=1;i<=num;i++)
             {
        		 if(i<=2000)
                 {
	            	 if(i%N==0)
	            	 {
	            		count++; 
	            	 }
	            	 else
	            	 {
	            		 String itostring=Integer.toString(i);//将i转化为字符串,并找出其中与N相同的字符
		            	 String ntostring=Integer.toString(N);
		            	 char nto[]=ntostring.toCharArray();
		            	 char ito[]=itostring.toCharArray();
		            	 boolean bool = false;
		            	 for(int j=0;j<ito.length;j++)
		            	 {
		            		 if (nto[0]==ito[j])
		            		 {
		            			 bool=true;//找到与N相同的字符
		            		 }
		            	 }
		            	 if(bool)
		            	 {
		            		count++; 
		            	 }
	            	 }
	            	
                 }
        		 else
        		 {
        			 num=num-2000;//报数的最大值为2000,如果报数超过2000,则下一个人重新从1开始报数
        			 i=1;
        		 }
             }
        	 System.out.println(sum-count+1);
         }
         
      
		 
	}



3. 公交站寻址(50分)


问题描述: 
一个N*N二维矩阵代表城市布局,元素值只有’.’,’X’ , ‘B’ , ‘S’,X代表当前位置,B代表路障,S代表公交站,’.’代表可行的路径。


现给定路径长度Y,找到能够到达的公交站的个数,路径中不能包含路障。


路径长度定义:


1、节点与其自身的距离为0


2、节点与其上、下、左、右四个相邻节点距离都为1


要求实现方法: 
public String findStat (String map, int iArrN, int iPathLen)


【输入】map:        城市布局


iArrN:             城市布局矩阵的行数


iPathLen:            给定的路径长度


【输出】无


【返回】能够到达的公交站个数


注:输入矩阵是以一维形式保存的二维数组,比如输入为"A, B, C, D, E, F,G, H, I",实际上表示如下3*3的矩阵:


A,B,C,


D,E,F,


G,H,I


示例 
输入:"...S.,.....,..X.S,.....,S....", 5, 3


返回:2


 


输入:"S...S,.....,....B,S....,....X", 5, 5


返回:1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值