就是问在一个n*m的棋盘里最多能放多少个knight,一开始想是回溯么,最后一想不是;

分为三种情况 n==1 || m==1 这种都明白

n==2 || m==2  这种情况下要除4,商乘4加上对余数的处理(画图后一目了然)

最后一种是n*m/2,不能整除时加一

#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>

using std::min;
using std::max;

int n,m;
int solve()
{
    int a=min(n,m);
    int b=n+m-a;
    if(a==1)
        return b;
    else if(a==2)
    {
        int c=b/4;
        b%=4;
        if(!b) return c*4;
        else if(b==1) return c*4+2;
        else  return c*4+4;
    }
    else
    {
        int c=n*m/2;
        if(c*2==n*m)
            return c;
        else return c+1;
    }
}
int main()
{
    while(scanf("%d%d",&n,&m)==2)
    {
        if(!n && !m) return 0;
        printf("%d",solve());
        printf(" knights may be placed on a %d row %d column board.\n",n,m);
    }
    return 0;
}
View Code

 

 

posted on 2014-01-14 15:33  风流monkey  阅读(170)  评论(0编辑  收藏  举报