例题2.1 象棋中的皇后 UVa11538

1.题目描述:点击打开链接

2.解题思路:本题利用加法原理解决。本题要求统计有多少种放置方法,可以使两个皇后相互攻击。因为只有2个皇后,而能够相互攻击的情况只有3种:同一行,同一列,同一对角线。这3种情况都没有交集,因此可以使用加法原理。设三种情况对应的方案数分别为A(n,m),B(n,m),D(n,m)。下面讨论如何计算这三个值。

A(n,m)的计算可以利用乘法原理:首先选择一格,一共有nm种选法,接下来再选一行中的其他位置,一共只有m-1个位置,因此A(n,m)=nm(m-1)。

B(n,m)的计算也可以利用乘法原理,不难得出B(n,m)=nm(n-1)。

D(n,m)的计算比较麻烦,不妨设n≤m,所有“/”方向的对角线长度依次为:1,2,3,...,n-1,n,n,n,...,n,n-1,n-2,...2,1。中间部分的n一共有m-n+1个,由于还有另一个方向的对角线,因此D(n,m)=2sum{2sum{i*(i-1)}+(m-n+1)*n*(n-1)}

其中的sum{i*(i-1)}可以分成两项利用公式计算,化简为n*(n-1)*(2*n-4)/3。

最终D(n,m)=2n(n-1)(3m-n-1)/3。

最后把三部分相加就是答案。注意为了防止中间计算部分溢出,要使用long long。

3.代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include<set>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<functional>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> P;
typedef pair<long long, long long> PL;

int main()
{
	//freopen("t.txt", "r", stdin);
	ull n, m;
	while (cin >> n >> m)
	{
		if (!n&&!m)break;
		if (n > m)swap(n, m);//这样就避免了对n<=m和n>m两种情况的讨论
		cout << n*m*(m + n - 2) + 2 * n*(n - 1)*(3 * m - n - 1) / 3 << endl;
	}
	return 0;
}
时间: 2024-10-07 06:32:30

例题2.1 象棋中的皇后 UVa11538的相关文章

UVA 11538【象棋中的皇后】Chess Queen

1.问题描述 本题主要是讲如何在一个给定的n*m棋盘中放置互相攻击的皇后(处于同一行,或者同一列,或者对角线上的任意两个位置(都不一定两者相邻)),求所能得到互相攻击的皇后的情况. 2.题意分析 本题主要考查加法原理和乘法原理的应用.根据题意可知,我们可以氛围以下方法进行分类求解(加法原理): (1)处于同一行的相互攻击的皇后种数: (2)处于同一列的相互攻击的皇后种数: (3)处于对角线的相互攻击的皇后种数(我们假设n<=m): 本公式很容易证明得出结果. 那么最后的结果我们可以归纳为: 3.

COJ 0020 30201象棋中的皇后

题解:其实是一道计数好题... 先得有个公式:多项平方和公式:1^2+2^2+3^2+…+n^2=n(n+1)(2n+1)/6 竖着的.横着的都还好.对于对角线,窝萌只要注意到长度的变化即可,别忘了有两条对角线! 然后算一下发现并不会溢出,所以就这样了... 1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 #include<queue&g

象棋中常用的最小值最大值算法及剪枝算法

1.象棋中通常需要推算当前局面下,每走一步之后的局面分,通常我们可以设定考虑几步棋,通常我们所说的算棋,而计算机的AI算法中最常用的就是最大值最小值算法,而剪枝算法是对最大值最小值算法的一种优化. 如上图所示: 1.如果在当前局面下,假设有三步可走的棋,走完之后得到的局面分分别为100,80,90,如果仅考虑一步的情况下,当然是选100所对应的棋走,这是最简单也是最短视的走法,这样的AI会让人认为太笨了.此时level=1 2.如果考虑两步棋的情况,走完第一步之后,轮到对方走了,对方走完之后,此

C#中八皇后问题的递归解法——N皇后

百度测试部2015年10月份的面试题之——八皇后. 八皇后问题的介绍在此.以下是用递归思想实现八皇后-N皇后. 代码如下: using System;using System.Collections.Generic; namespace QueensSolution { class Program { static int count = 0; static void Main(string[] args) { int n = Int32.Parse(Console.ReadLine()); L

【tool】运用因果图法设计象棋中马行走路线的测试用例

因果图法设计用例 需求规格: 1.如果落点在棋盘外,则不移动棋子; 2.如果落点与起点不构成日字型,则不移动棋子; 3.如果落点处有自己方棋子,则不移动棋子; 4.如果在落点方向的邻近交叉点有棋子(绊马腿),则不移动棋子; 5.如果不属于1-4条,且落点处无棋子,则移动棋子; 6.如果不属于1-4条,且落点处为对方棋子(非老将),则移动棋子并除去对方棋子; 7.如果不属于1-4条,且落点处为对方老将,则移动棋子,并提示战胜对方,游戏结束. 一.原因条件: 1. 落点在棋盘上; 2. 落点与起点构

基于VB中WINSOCK控件的网上象棋系统的实现

本文发表在<微型机与应用>杂志2001年第3期. 马根峰1   ,  孙艳2  , 王平1 (1.重庆邮电学院自动化学院,重庆,400065:2. 铁道部第十九工程局四处,内蒙 通辽,028000 )  摘要     本文首先介绍了Visual Basic中的WINSOCK控件的使用方法,然后深入探讨了网上象棋系统的设计思想及其实现过程. 关键词    WINSOCK控件:TCP:UDP 中图分类号: 文献标识码: 1      引言 MicrosoftVisual Basic 是可视化的.面

BZOJ 4806 - 4809 象棋四题

4806: 炮 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 103  Solved: 72[Submit][Status][Discuss] Description 众所周知,双炮叠叠将是中国象棋中很厉害的一招必杀技.炮吃子时必须隔一个棋子跳吃,即俗称"炮打隔子". 炮跟炮显然不能在一起打起来,于是rly一天借来了许多许多的炮在棋盘上摆了起来……他想知道,在N×M的矩形 方格中摆若干炮(可以不摆)使其互不吃到的情况下方案数有几种. 棋

团队-编程项目 中国象棋-需求分析

需求分析: 1.棋盘和棋子的绘制 2.按照象棋规则对棋子进行布局   3.鼠标响应 : 在对弈中,棋子是必须可以移动的,不然游戏无法进行.因此,鼠标左键点击是必不可少的一部分. 4.棋子的功能分析:  中国象棋中各色的象棋棋子的功能使象棋具有了真正的趣味性,中国象棋的棋子的类型大致分为:帅(将).士.象.马.车.炮.兵(卒)等几个类型.  帅(将):红方中的帅和黑方中的将的功能相同,都是只能在九宫格中进行横向和竖向的移动,每次移动一格,并且不能移动超出九宫格,帅和将不能见面.  士:士在整片棋盘

14-n皇后

/*题目内容: 国际象棋中的皇后可以沿着水平线,垂直线,或者斜线前进,吃掉遇到的所有棋子,如果棋盘上有八个皇后,则这八个皇后如何相安无事的放置在棋盘上,1970年与1971年, E.W.Dijkstra与N.Wirth曾经用这个问题来讲解程式设计之技巧.该题要求N皇后的放置结果共有多少种 输入描述 输入一个正整数N(N小于16) 输出描述 输出结果输入样例8 输出样例92*/ #include <iostream>#include <algorithm>using namespac