uva 278 - Chess(计数问题)

题目链接:uva 278 - Chess

题目大意:给出一个n*m的棋盘,并且给出棋子的种类,问说在这个大小的棋盘上最多能放几个给定的棋子,棋子之间不能互相攻击。

解题思路:总共有4种棋子,那么就分类讨论。

马(骑士):

n或m为1的时候,肯定可以摆满,因为肯定不能互相攻击

n或者m为2时,这样放是最优的。

其他情况的或就是间隔放最优。

车:因为车的攻击方式是直线,所以每放一个车就会攻击到一列一行,所以答案就是n和m中最小的那个。

国王:国王的攻击范围是周围8个格子,所以放法就像考试隔排隔位一样。

皇后:皇后不仅可以攻击直线,还可以攻击斜线,所以放的个数肯定不能比车放的要多,那么就考虑min(n,m)能不能放下,这里n和m恰好大于等于4,学习8皇后问题的时候有一个知识点,就是n*n的矩阵,n ≥4的话是有解的。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;
const int t[4] = {0, 2, 4, 0};

int m, n;
char ch[20];

int knight() {
	int p = max(n, m);
	int q = min(n, m);

	if (q == 1) {
		return p;
	} else if (q == 2) {
		int s = p / 4;
		int d = p % 4;
		return s * 4 + t[d];
	} else
		return (n * m + 1) / 2;
}

int main () {
	int cas;
	scanf("%d", &cas);
	while (cas--) {
		scanf("%s%d%d", ch, &m, &n);
		if (ch[0] == ‘r‘)
			printf("%d\n", min(m, n));
		else if (ch[0] == ‘k‘)
			printf("%d\n", knight());
		else if (ch[0] == ‘Q‘)
			printf("%d\n", min(m, n));
		else if (ch[0] == ‘K‘)
			printf("%d\n", (n+1)/2 * ((m+1)/2));
	}
	return 0;
}

uva 278 - Chess(计数问题),码迷,mamicode.com

时间: 2024-11-29 03:25:57

uva 278 - Chess(计数问题)的相关文章

UVA 278 - Chess(数论)

题目链接:278 - Chess 题意:求出四种棋子最多放几个 思路:车能放行列的较小值,王隔着放,皇后根据八皇后问题可知,也是放行列最小值. 关键在于马,之前做过一题类似的,马分一行,两行,和两行以上考虑,一行就能全放,两行就隔一个田字格放,三行以上就每个马隔一个位置放. 代码: #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int t, n, m; c

【策略】UVa 278 - Chess

Chess  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  

UVA 11538 - Chess Queen(数论+计数问题)

题目链接:11538 - Chess Queen 题意:给一个n*m棋盘,问放两个皇后,使得两个皇后互相能攻击到,有几种放法 思路:分横竖,对角线来考虑. 横:n * A(m, 2)种 竖:m * A(n, 2)种 对角线:由于有两条,可以算一条再乘2 2 * 所有对角线和(A(对角线格数,2)). 那么对角线格数为:(1, 2, 3, 4 ... n .n .n .n.n - 1. .. 4. 3 .2. 1) 然后为n的有m - n + 1条(m >= n) 所以答案为:2*(2*∑i*(i

uva 11538 - Chess Queen(数论)

题目链接:uva 11538 - Chess Queen 题目大意:在一个n?m的棋盘上,放两个皇后,要求两个皇后可以互相攻击,求有多少种放法. 解题思路:因为皇后的攻击范围为竖线.横线和斜线,所以枚举每条上两个皇后放的位置,比如一条斜线有8个,那么放两个皇后的种数就有C(82)种. 行数n,每行m个位置C(m2)?n 列数m,每列n个位置C(n2)?m 斜线,2?(2?∑i=1n?1i?(i?1)+(m?n+1)?n?(n?1)),因为正斜线和翻斜线,所以要乘以2 最后公式化简为2?n?(n?

uva 11645 - Bits(计数问题+高精度)

题目链接:uva 11645 - Bits 题目大意:给出n,问从0到n这n+1个数种,数的二进制情况下,有多少11存在. 解题思路:和uva 11038一个类型的题目,只是这道题目是对于二进制下的情况.而且高精度部分可以用两个long long数解决. #include <cstdio> #include <cstring> typedef long long ll; const int N = 100; const ll M = 1e13; ll bit (int k) { r

uva 11538 - Chess Queen(组合数)

UVa  Online Judge https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2533 [题意] 给定一个棋盘,在棋盘上放两个皇后(一白一黑),求使得两个皇后相互攻击(在一行.一列.对角线均可相互攻击),求方案数. 计数问题,分类: 1.在一行或一列:n*m(m-1),m*n*(n-1) 2.在对角线,假设n<m,则各对角线长度

UVA - 11538 - Chess Queen (数论~)

11538 Chess Queen You probably know how the game of chess is played and how chess queen operates. Two chess queens are in attacking position when they are on same row, column or diagonal of a chess board. Suppose two such chess queens (one black and

【组合计数】UVA - 11538 - Chess Queen

考虑把皇后放在同一横排或者统一纵列,答案为nm(m-1)和nm(n-1),显然. 考虑同一对角线的情况不妨设,n<=m,对角线从左到右依次为1,2,3,...,n-1,n,n,n,...,n(m-n+1个n),n-1,n-2,...,2,1 还有另一个方向的对角线,所以算出来之后要乘二. 即答案为2(2*Σ(i to n-1) (i(i-1))    +   (m-n+1)n(n-1)) Σ(i to n-1) (i(i-1))怎么算呢? 可以拆成Σi2 - Σi , i2的前缀和公式我就不推了

【基本计数方法---加法原理和乘法原理】UVa 11538 - Chess Queen

题目链接 题意:给出m行n列的棋盘,当两皇后在同行同列或同对角线上时可以互相攻击,问共有多少种攻击方式. 分析:首先可以利用加法原理分情况讨论:①两皇后在同一行:②两皇后在同一列:③两皇后在同一对角线( / 或 \ ): 其次利用乘法原理分别讨论: ①同一行时(A),先选某一行某一列放置其中一个皇后,共m*n种情况:其次在选出的这一行里的其他n-1个位置中选一个放另一个皇后:共m*n*(n-1)种情况: ②同一列时(B)情况相同,为n*m*(m-1)种情况: ③同一对角线(D)上时,先讨论 /