题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4925
思路:直接计算坐标和,如果为奇数就种树,但要注意行或列为1的情况。
写啦两种代码:一种直接判断计算的,另一种优化计算的
code1:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m,i,j;
while(scanf("%d%d",&n,&m)==2)
{
int sum=0;
if(n==1&&m==1) //特殊情况
{
printf("1\n");
}
else if(n==1||m==1) //特殊情况
{
if(m==1)
{
int t=n;
n=m;
m=t;
}
if(m%2==0)
{
sum=sum+(m-1)*2;
}
else
{
sum+=(m/2*4);
}
printf("%d\n",sum);
}
else
{
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if((i+j)%2==1)
{
if(i==1||i==n)
{
if(j==1||j==m)
{
sum+=4;
}
else
{
sum+=8;
}
}
else if(j==1||j==m)
{
if(i==1||i==n)
sum+=4;
else
{
sum+=8;
}
}
else //if(i!=1&&i!=n&&j!=1&&j!=m)
{
sum+=16;
}
}
}
}
printf("%d\n",sum);
}
}
}
return 0;
}
code2:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int a[110][110];
int main()
{
int T,n,m;
scanf("%d",&T);
while(T--)
{
int n,m,sum=0;
scanf("%d%d",&n,&m);
if(n==1&&m==1)
{
printf("1\n");
}
else if(n==1||m==1)
{
if(m==1)
{
int t=n;
n=m;
m=t;
}
if(m%2==0)
{
sum=sum+(m-1)*2;
}
else
{
sum+=(m/2*4);
}
printf("%d\n",sum);
}
else
{
if(n%2==1)
{
int t=n;
n=m;
m=t;
}
if(m%2==0)
{
sum+=((m-1)*8);
//printf("BB %d\n",sum);
sum+=((m/2-1)*(n-2)*16+(n-2)*8);
//printf("BB %d\n",sum);
}
else
{
if(n%2==0)
{
sum+=((m-1)*8);
sum+=((n-2)/2*(m-2)*16);
sum+=((n-2)*8);
}
else
{
sum+=(m/2*16);
//printf("AA %d\n",sum);
sum+=((n-2)/2*(m-2)*16);
//printf("BB %d\n",sum);
sum+=((m-2)/2*16);
//printf("CC %d\n",sum);
sum+=((n-1)*8);
//printf("DD %d\n",sum);
}
}
printf("%d\n",sum);
}
}
return 0;
}hdu 4925 Apple Tree,布布扣,bubuko.com
原文地址:http://blog.csdn.net/u010304217/article/details/38426279