在 2*2的棋盘上放俩个相互攻击的皇后(一黑一白),一共有12中方法。如果棋盘是N*M的,有多少种放置两个相互攻击的皇后?例如n=100,m=233是答案为10907100.
分析:
因为只有两个皇后,所以攻击的方式只有同行同列或同一对角线上。
A(m,n)表示同行的方法为nm(m-1);'
B(m,n)表示同列的方法为nm*(m-1)
D(m,n)表示同一对角线的情况,这种情况比较复杂。
不妨设n<=m,则所有/向的对角线的长度分别为
1,2,3,。。。,n,n,n,n...n,n-1,n-2...1
其中中间有m-n+1个n。
所以每一个下划线的方式个数为i(i-1)个。求和就可以求出总数。由于左对角线与右对角线相同,所以乘2即可得到D(M,N)的值。
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n,m;
while(cin>>n>>m){
if(!m&&!n) break;
if(n>m) swap(n,m);//保证n<=m
cout<<m*n*(m+n-2)+2*n*(n-1)*(3*m-n-1)/3<<endl;//前者为同行同列的总数,后者为同一对角线的化简求和表达式
}
return 0;
}