278 - Chess
Time limit: 3.000 seconds
Almost everyone knows the problem of putting eight queens on an
chessboard such that no Queen can take another Queen. Jan Timman (a famous Dutch chessplayer) wants to know the maximum number of chesspieces of one kind which can be put on an
board with a certain size such that no piece can take another. Because it's rather difficult to find a solution by hand, he asks your help to solve the problem.
He doesn't need to know the answer for every piece. Pawns seems rather uninteresting and he doesn't like Bishops anyway. He only wants to know how many Rooks, Knights, Queens or Kings can be placed on one board, such that one piece can't take any other.
Input
The first line of input contains the number of problems. A problem is stated on one line and consists of one character from the following set r, k, Q, K, meaning respectively the chesspieces Rook, Knight, Queen or King. The character is followed by the integers m (
) and n (
), meaning the number of rows and the number of columns or the board.
Output
For each problem specification in the input your program should output the maximum number of chesspieces which can be put on a board with the given formats so they are not in position to take any other piece.
Note: The bottom left square is 1, 1.
Sample Input
2 r 6 7 k 8 8
Sample Output
6 32
此题是UVa 696 的升级版。
r和Q都是max(m,n)
k的公式详见这里。
K就是一个点周围8个不能有其他点。
完整代码:
/*0.009s*/
#include <cstdio>
int cal(char ch, int m, int n)
{
if (m > n) return cal(ch, n, m);
if (ch == 'r' || ch == 'Q') return m;
if (ch == 'K') return ((n + 1) >> 1) * ((m + 1) >> 1);
if (m == 1) return n;
if (m == 2) return (n >> 2 << 2) + ((n % 4 == 3 ? 2 : n % 4) << 1);
return (n * m + 1) >> 1;
}
int main()
{
int t, m, n;
char ch;
scanf("%d", &t);
getchar();
while (t--)
{
scanf("%c%d%d", &ch, &m, &n);
getchar();
printf("%d\n", cal(ch, m, n));
}
return 0;
}

本文探讨了如何在不同尺寸的棋盘上放置最多数量的特定棋子(车、马、后、王),使得任意两个棋子不会互相攻击。文章提供了一个算法解决方案,并给出了具体的实现代码。
1080

被折叠的 条评论
为什么被折叠?



