题目意思
给你一个n*m的棋盘,按照象棋中的马走日的方法,计算在这个棋盘中存在多少的对点。
解题思路
我们可以发现当棋盘的大小达到3*4的时候,棋盘中的每个点都可以走到,那么3 * 4的时候,它们的对点数就是(n * m) * (n * m-1)/2。
当棋盘大小为3*3时,除了中间那个点无法到达以外,其他的点都可以到达,那么对点数就是C82。
当棋盘大小为2*m或者n*2的时候我们就要考虑奇偶的情况了。在纸上画一下就可以找到规律。
除此以外不足2*2的棋盘肯定不存在对点,直接输出0即可。
代码部分
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <map>
using namespace std;
#define ll long long
int main()
{
ll n,m;
while(~scanf("%lld%lld",&n,&m))
{
if(n==1||m==1)
{
printf("0\n");
continue;
}
if(m<=2&&n<=2)
{
printf("0\n");
continue;
}
if(m==2||n==2)
{
ll ans;
if(m==2)
{
if(n%2==0)
{
ll k=(n-2)/2;
ans=k*(k+1)*2;
}
else
{
ll k=(n-2)/2,k1=k+1;
ans=k*(k+1)*2+k1*2;
}
}
else
{
if(m%2==0)
{
ll k=(m-2)/2;
ans=k*(k+1)*2;
}
else
{
ll k=(m-2)/2,k1=k+1;
ans=k*(k+1)*2+k1*2;
}
}
printf("%lld\n",ans);
continue;
}
if(m==3&&n==3)
{
printf("28\n");
continue;
}
if(m>=3&&n>=3)
{
ll ans=(m*n-1)*(m*n)/2;
printf("%lld\n",ans);
continue;
}
}
return 0;
}