Chess Queen
Input: Standard Input
Output: Standard Output
Time limit: 2.000 seconds
You probably know how the game of chess is played and how chess queen operates. Two chess queens are in attacking position when they are on same row, column or diagonal of a chess board. Suppose two such chess queens (one black and the other white) are placed on (2x2) chess board. They can be in attacking positions in 12 ways, these are shown in the picture below:
| |
|
Figure: in a (2x2) chessboard 2 queens can be in attacking position in 12 ways |
Given an (NxM) board you will have to decide in how many ways 2 queens can be in attacking position in that.
Input
Input file can contain up to 5000 lines of inputs. Each line contains two non-negative integers which denote the value ofM andN (0< M, N£106) respectively.
Input is terminated by a line containing two zeroes. These two zeroes need not be processed.
Output
For each line of input produce one line of output. This line contains an integer which denotes in how many ways two queens can be in attacking position in an (MxN) board, where the values ofM andN came from the input. All output values will fit in 64-bit signed integer.
找出递推的规律,然后转化为数学公式。
#include<cstdio>
using namespace std;
int main()
{
long long n,m,s,i,min;
while(scanf("%lld%lld",&n,&m)==2 && n!=0 || m!=0)
{
if(n==0 || m==0)
s=0;
else if(n==1)
s=m*(m-1);
else if(m==1)
s=n*(n-1);
else
{
s=12;
for(i=3;i<=n;i++)
{
s=s+4*(i-1)+6;
}
for(i=3;i<=m;i++)
{
min=i<n?i:n;
if(n>i)
s+=(n-i)*(min-1)*4;
s=s+2*n*(i-1)+(min-1)*min*2+n*(n-1);
}
}
printf("%lld\n",s);
}
return 0;
}
#include<cstdio>
using namespace std;
int main()
{
long long n,m,s,i,tmp;
while(scanf("%lld%lld",&n,&m)==2 && n!=0 || m!=0)
{
if(n<m)
{
tmp=m; m=n; n=tmp;
}
if(n==0 || m==0)
s=0;
else if(n==1)
s=m*(m-1);
else if(m==1)
s=n*(n-1);
else
{
s=12+(n+1)*(n-2)*2+6*(n-2);
s=s+n*(n-1)*(m-2)+n*(m+1)*(m-2);
for(i=3;i<=m;i++)
{
s+=(n-i)*(i-1)*4;
s+=(i-1)*i*2;
}
}
printf("%lld\n",s);
}
return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
unsigned long long n,m;
while(cin>>n>>m,n||m){
if(n>m)
swap(n,m);
cout<<n*m*(n+m-2)+2*n*(n-1)*(3*m-n-1)/3<<endl;
}
return 0;
}
本文深入探讨了如何通过递归和数学公式来计算在给定大小的棋盘上放置两个皇后时,它们能形成攻击位置的数量。通过分析不同棋盘尺寸下皇后攻击位置的变化规律,提出了高效的计数算法,并提供了三种不同的实现方式。

527

被折叠的 条评论
为什么被折叠?



