题目:求棋盘上最多能放几个马。
分析:简单题、构造。分三类情况讨论:1.min(n,m) = 1,则摆放max(n,m);2.min(n,m) = 2,则每2*2个为一组,奇数组填满偶数组放空;3.其他,按照行列加和的奇偶性放入相同奇偶性的格子必不冲突,即(m*n+1)/2。
注意:当答案 <= 1 时 也要用复数 。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int f( int n, int m )
{
if ( n < m ) return f( m, n );
if ( m == 1 ) return n;
if ( m == 2 ) return n/4*4+(n%4<3?n%4:2)*2;
return (n*m+1)/2;
}
int main()
{
int n,m;
while ( scanf("%d%d",&n,&m) && n+m ) {
int ans = f(n,m);
printf("%d ",ans);
if ( ans > 1 ) printf("knights");
else printf("knights");
printf(" may be placed on a %d row %d column board.\n",n,m);
}
return 0;
}