UVa 696 - How Many Knights

题目:求棋盘上最多能放几个马。

分析:简单题、构造。分三类情况讨论: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;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值