iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 3
0
自我挑戰組

資工的日常系列 第 3

CPE考題 How Many Knights

  • 分享至 

  • xImage
  •  

2017/09/26 CPE
考題連結:https://cpe.cse.nsysu.edu.tw/cpe/file/attendance/problemPdf/696.pdf

大概題意:
其實就是棋盤問題。這題跟程式邏輯沒什麼關係。Knights攻擊方式跟象棋的馬很像,都是打到1X2格。解法幾乎是固定的。

input:
M-rows N-columns
0 0 讀到0 0時結束
output:
列出給定的M行N列可以裝幾個Knights不會打到彼此。
格式:4 knights may be placed on a 2(M) row 3(N) column board.

做法:
MXN,比較欄列大小。短的叫less,較長的那邊叫more。都以較短的那一邊做判斷。
如果less=1(橫的1條),最大就是看more(都不會打到)。
如果less=2,則一次4X2個方塊做計算。每完整的4X2都有2X2不會互相打到。如果較長的那邊不是4的倍數就要額外計算。我的做法是如果more%4取餘數<=2(多出一格、兩格或剛好),就算長的那邊%4多出多少X2。如果more%4取餘數>=2,也就是3,最多就只有4格。圖示:
https://ithelp.ithome.com.tw/upload/images/20171223/201078669jcf8hiFCS.png

算出會多出幾個後,就除4算完整的4X2方塊有幾個,在乘4(2X2不會被打到)https://chart.googleapis.com/chart?cht=tx&amp;chl=more%2F442。,在加上剛剛算出的extra值即為答案
less=3,代表就3X3以上的平面,最多(MXN+1)/2個不會互相打到(9公格有5格,X形狀)。

程式碼:

import java.util.Scanner;
public class HowManyKnights {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		int row,column;
		while( (row=scanner.nextInt())!=0 && (column=scanner.nextInt())!=0 ){
			int knightCount=9,less,more;
			//find which is less value and more value
			if(row>column){
				less=column;
				more=row;
			}else{
				less=row;
				more=column;
			}
			
			//1line:more value
			if(less==1){
				knightCount=more;
			//2line:count 4*2 blocks at a time, extra area count as 2 or 4 
			}else if(less==2){
				int extra;
				if(more%4<=2){
					extra=more%4*2;
				}else{
					extra=4;
				}
				knightCount=more/4*4+extra;
			//more than 3*3:plaid
			}else{
				knightCount=(less*more+1)/2;
			}
			System.out.println(knightCount+" knights may be placed on a "+row+" row "+column+" board.");
		}
		scanner.close();
	}

}

測試資料:
https://cpe.cse.nsysu.edu.tw/cpe/file/attendance/problemPdf/testData/uva696a.php
結果:https://ithelp.ithome.com.tw/upload/images/20171223/20107866w0E2ujCbJh.png


上一篇
CPE考題 Rockabye Tobby
下一篇
HTML 做出2層的下拉式選單 JavaScript
系列文
資工的日常30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言