天天看點

計蒜客-蒜頭君下棋(找規律)

蒜頭君下棋

蒜頭君喜歡下棋。最近它迷上了國際象棋。國際象棋的棋盤可以被當做一個 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      
  1. 對于題目給出的n,m,讓a是m,n中的較小者,讓b是m,n中的較大者。  
  2. 如果n為1,則按圖1排放,即圖中最上方的圖。  
  3. 如果n為2,則按圖2排放。即圖中中間的圖。  
  4. 如果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;
}