这道题因为数据范围很小,所以可以用枚举实现,将所有可能的情况都记录在hash数组里,再扫一遍即可,代码如下:
#include<stdio.h>
int hash[202];
int abs(int x)
{
return x>0?x:-x;
}
int main()
{
int t,n,m,i,j;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=0;i<=m+n;i++)hash[i]=0;
int max=0,k;
for(i=1;i<=m/2;i++)
{
j=m-i;
int sum=0;
hash[i]=1;
hash[j]=1;
hash[n]=1;
hash[i+j]=1;
hash[i+n]=1;
hash[j+n]=1;
hash[abs(n-i)]=1;
hash[abs(n-j)]=1;
hash[abs(i-j)]=1;
hash[abs(n-i-j)]=1;
hash[abs(n-i+j)]=1;
hash[abs(n+i-j)]=1;
hash[abs(n+i+j)]=1;
for(k=1;k<=n+m;k++)
{
if(hash[k])sum++;
hash[k]=0;
}
if(sum>max)
max=sum;
}
int temp=n;
n=m;
m=temp;
for(i=1;i<=m/2;i++)
{
int j=m-i,sum=0;
hash[i]=1;
hash[j]=1;
hash[n]=1;
hash[i+j]=1;
hash[i+n]=1;
hash[j+n]=1;
hash[abs(n-i)]=1;
hash[abs(n-j)]=1;
hash[abs(i-j)]=1;
hash[abs(n-i-j)]=1;
hash[abs(n-i+j)]=1;
hash[abs(n+i-j)]=1;
hash[abs(n+i+j)]=1;
for(k=1;k<=n+m;k++)
{
if(hash[k])sum++;
hash[k]=0;
}
if(sum>max)
max=sum;
}
printf("%d\n",max);
}
return 0;
}