Knights in Chessboard
Given an m x n chessboard where you want to place chess knights. You have to find the number of maximum knights that can be placed in the chessboard such that no two knights attack each other.
Those who are not familiar with chess knights, note that a chess knight can attack 8 positions in the board as shown in the picture below.
Input
Input starts with an integer T (≤ 41000), denoting the number of test cases.
Each case contains two integers m, n (1 ≤ m, n ≤ 200). Here m and n corresponds to the number of rows and the number of columns of the board respectively.
Output
For each case, print the case number and maximum number of knights that can be placed in the board considering the above restrictions.
Sample Input
3
8 8
3 7
4 10
Sample Output
Case 1: 32
Case 2: 11
Case 3: 20
题意
给出棋盘大小,找到可以放的最多互不攻击的骑士棋子,其中骑士棋子攻击图在题中
题解
我们设
a
n
s
ans
ans为骑士棋子数量,
k
=
m
∗
n
k=m*n
k=m∗n为棋盘大小
首先,很明显这棋盘颜色都明摆着告诉我们,当棋盘足够大(
m
、
n
>
=
3
m、n>=3
m、n>=3)时,
k
k
k为奇数,
a
n
s
=
k
/
2
+
1
ans=k/2+1
ans=k/2+1,
k
k
k为偶数时,
a
n
s
=
k
/
2
ans=k/2
ans=k/2
其次就是考虑特殊情况,当
n
=
1
n=1
n=1时,
a
n
s
=
m
ans=m
ans=m,当
m
=
1
m=1
m=1时,
a
n
s
=
n
ans=n
ans=n
当
n
、
m
n、m
n、m有一个为2时,我们判断棋盘可以分成多少2x2的小棋盘,我们设可以分为
x
=
k
/
4
x=k/4
x=k/4个(注意后面可能有两个格子空余),如果我们不考虑可能多出来的两个小格子,那么
a
n
s
=
(
x
/
2
+
x
%
2
)
∗
4
ans=(x/2+x\%2)*4
ans=(x/2+x%2)∗4,再加上可能存在的两个小格子,当
x
%
2
=
0
且
k
%
4
=
̸
0
x\%2=0且k\%4=\not0
x%2=0且k%4≠0时,
a
n
s
+
2
ans +2
ans+2
代码
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <math.h>
#include <ctime>
#include <unordered_map>
//#include <tr1/unordered_map>
using namespace std;
#define me(x,y) memset(x,y,sizeof x)
#define MIN(x,y) x < y ? x : y
#define MAX(x,y) x > y ? x : y
typedef long long ll;
typedef unsigned long long ull;
const long double INF = 0x3f3f3f3f;
const int MOD = 1e9+7;
const double eps = 1e-06;
const long double PI = std::acos(-1);
const int M=32768;
const int maxn = 1010;
int main() {
int t,ca=1;
cin>>t;
while(t--){
int m,n;
cin>>m>>n;
int k = m*n;
int ans;
if(m == 1) ans = n;
else if(n == 1) ans= m;
else if(m == 2||n == 2){
int x = k/4;
ans = (x/2+x%2)*4;
if(x%2 == 0 && k%4 != 0) ans += 2;
}
else ans = (k%2==0)?k/2:(k/2+1);
printf("Case %d: %d\n",ca++,ans);
}
return 0;
}
/*
*/