蒜頭君下棋
蒜頭君喜歡下棋。最近它迷上了國際象棋。國際象棋的棋盤可以被當做一個 8×88\times 88×8 的矩陣,棋子被放在格子裡面(不是和中國象棋一樣放線上上)。
蒜頭君特别喜歡國際象棋裡面的馬,馬的移動規則是這樣的:橫着走兩步之後豎着走一步,或者橫着走一步之後豎着走兩步。例如,一匹馬在 (3,3)(3,3)(3,3) 的位置,則它可以到達的地方有 (1,2)(1,2)(1,2),(2,1)(2,1)(2,1),(1,4)(1,4)(1,4),(4,1)(4,1)(4,1),(5,2)(5,2)(5,2),(2,5)(2,5)(2,5),(5,4)(5,4)(5,4),(4,5)(4,5)(4,5) 八個地方。蒜頭君想要把整個棋盤都放上馬,并且讓這些馬不能互相攻擊(即任何一匹馬不能走一步之後就到達另一匹馬的位置)。蒜頭君當然知道在 8×88 \times 88×8 的棋盤上怎麼放馬,但如果棋盤變為 n×mn \times mn×m 的,蒜頭君就不懂了。他希望你來幫忙他計算一下究竟能放多少匹馬。
輸入格式
共一行,兩個整數nnn和mmm(1≤n,m≤1000 1 \leq n , m \leq 10001≤n,m≤1000),代表棋盤一共有 nnn 行 mmm 列。
輸出格式
輸出一個整數,代表棋盤上最多能放的馬的數量。
樣例輸入1
2 4
樣例輸出1
4
樣例輸入2
3 4
樣例輸出2
6
- 對于題目給出的n,m,讓a是m,n中的較小者,讓b是m,n中的較大者。
- 如果n為1,則按圖1排放,即圖中最上方的圖。
- 如果n為2,則按圖2排放。即圖中中間的圖。
- 如果n比2大,則按圖3排方。即圖中最下方的圖。

code:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int main(){
int n,m;
scanf("%d%d",&n,&m);
int a = n,b = m;
n = min(a,b);
m = max(a,b);
if(n == 1){
printf("%d\n",m);
}
else if(n == 2){
if(m % 4 == 3){
printf("%d\n",m/4*4+4);//四個列一循環,看餘數
}
else{
printf("%d\n",m/4*4+m%4*2);
}
}
else{
int ans = n * (m / 2);
if(m % 2){
ans += (n + 1) / 2;
}
printf("%d\n",ans);
}
return 0;
}