2011年華爲杯校園編程大賽

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章