象棋中的皇后

   在 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;

 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值