就是问在一个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; }