本文主要是介绍uva 11538 Chess Queen,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
// uva 11538 Chess Queen
//
// 题目大意:
//
// 在 n * m 的棋盘中,放两个皇后,一个黑的,一个白的
// 求能让两个皇后相互攻击的放法,有多少种
//
// 解题思路:
//
// 皇后攻击的方式只有在同一行,同一列,或者同一对角线
// 上,分类讨论:
//
// 1): 同一行,则白的放法有 n * m 种,黑的放法有m-1种
//
// 2): 同一列,则白的方法有 m * n 种,黑的放法有n-1种
//
// 3): 同一对角线,则第一个皇后的方法沿对角线依次为
// 1,2,3....n-1,n,....,n,n-1,...,3,2,1,因为对角线
// 一共m+n-1条,两边各有n-1,则放n的有m-n+1种,则
// 对角线上方法为
// sigma(i * (i-1)){ 1<=i<=n-1} * 2+ (m-n+1)*n*(n-1)
// 因为有两条对角线,主对角线和副对角线.这里应该再*2
// 再用unsigned long long 就over啦~~~~
//
// 感悟:
//
// 算法竞赛训练指南上的题目,实在是太美妙啦~~~继续加油~~~
// FIGHTING#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;typedef unsigned long long ull;int main(){ull n,m;//freopen("1.txt","r",stdin);while(cin >> n >> m){if (!n && !m)break;if (n > m)swap(n,m);ull x;x = n * (n - 1) * (2 * n - 1) / 6;x = x - n * (n - 1) / 2;x = x * 2;x = x + (m - n + 1) * n * (n - 1);x = x * 2;x = x + m * n * (m + n - 2);cout << x << endl;}
}
这篇关于uva 11538 Chess Queen的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!