大概題意:
其實就是棋盤問題。這題跟程式邏輯沒什麼關係。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格。圖示:
程式碼:
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
結果: