题解:题目的数据量较小,直接枚举拆 x 或者 y 的所有答案即可。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int vis[500];
int main()
{
int n, x, y, res;
int a,b,rst;
while(scanf("%d", &n) != EOF)
{
while(n --)
{
res = 0;
rst = 0;
scanf("%d %d", &x, &y);
for(int i = 1; i < x; i ++)
{
memset(vis,0,sizeof(vis));
a = i;
b = x - i;
res = 0;
if(!vis[a]){res ++; vis[a] ++;}
if(!vis[b]){res ++; vis[b] ++;}
if(!vis[a + b]){res ++; vis[a + b] ++;}
if(!vis[y]){res ++; vis[y] ++;}
if(!vis[abs(a-b)]){res ++; vis[abs(a-b)] ++;}
if(!vis[abs(a+y)]){res ++; vis[abs(a+y)] ++;}
if(!vis[abs(a-y)]){res ++; vis[abs(a-y)] ++;}
if(!vis[abs(b-y)]){res ++; vis[abs(b-y)] ++;}
if(!vis[(abs(b + y))]){res ++; vis[abs(b + y)] ++;}
if(!vis[a + b + y]){res ++; vis[a + b + y] ++;}
if(!vis[abs(a+b-y)]){res ++; vis[abs(a+b-y)] ++;}
if(!vis[abs(abs(a-b)+y)]){res ++; vis[abs(abs(a-b)+y)] ++;}
if(!vis[abs(abs(a-b)-y)]){res ++; vis[abs(abs(a-b)-y)]++;}
if(!vis[abs(abs(y-a)-b)]){res ++; vis[abs(abs(y-a)-b)]++;}
if(!vis[abs(abs(y-a)+b)]){res ++; vis[abs(abs(y-a)+b)] ++;}
if(!vis[abs(abs(b-a)-y)]){res ++; vis[abs(abs(b-a)-y)]++;}
if(!vis[abs(abs(b-a)+y)]){res ++; vis[abs(abs(b-a)+y)]++;}
if(vis[0] >= 1) res --;
if(res>rst){
rst = res;
}
}
int t = x;
x = y;
y = t;
for(int i = 1; i < x; i ++)
{
memset(vis,0,sizeof(vis));
res = 0;
a = i;
b = x - i;
if(!vis[a]){res ++; vis[a] ++;}
if(!vis[b]){res ++; vis[b] ++;}
if(!vis[a + b]){res ++; vis[a + b] ++;}
if(!vis[y]){res ++; vis[y] ++;}
if(!vis[abs(a-b)]){res ++; vis[abs(a-b)] ++;}
if(!vis[abs(a+y)]){res ++; vis[abs(a+y)] ++;}
if(!vis[abs(a-y)]){res ++; vis[abs(a-y)] ++;}
if(!vis[abs(b-y)]){res ++; vis[abs(b-y)] ++;}
if(!vis[(abs(b + y))]){res ++; vis[abs(b + y)] ++;}
if(!vis[a + b + y]){res ++; vis[a + b + y] ++;}
if(!vis[abs(a+b-y)]){res ++; vis[abs(a+b-y)] ++;}
if(!vis[abs(abs(a-b)+y)]){res ++; vis[abs(abs(a-b)+y)] ++;}
if(!vis[abs(abs(a-b)-y)]){res ++; vis[abs(abs(a-b)-y)]++;}
if(!vis[abs(abs(y-a)-b)]){res ++; vis[abs(abs(y-a)-b)]++;}
if(!vis[abs(abs(y-a)+b)]){res ++; vis[abs(abs(y-a)+b)] ++;}
if(!vis[abs(abs(b-a)-y)]){res ++; vis[abs(abs(b-a)-y)]++;}
if(!vis[abs(abs(b-a)+y)]){res ++; vis[abs(abs(b-a)+y)]++;}
if(vis[0] >= 1) res --;
if(res>rst){
rst = res;
}
}
printf("%d\n",rst);
}
}
return 0;
}