题目链接:http://codeforces.com/contest/1004/problem/D
我们模一遍就可以发现如果没有到边界的时候,所有数字往外扩都是4的倍数,那我们只要找到第一个个数不是4的倍数的数就是横轴下标,然后我们for一遍n,y就是n+m-maxn-x,因为x+maxn的横轴就是m,再减去maxn的纵轴就是y了,看看每个数的个数是否符合。
#include<iostream>
#include<cstring>
#include<stdlib.h>
using namespace std;
int a[1000005];
int res[1000005];
int main()
{
int n,m,x,y,t,maxn=0;
cin>>t;
for(int i=1;i<=t;i++)
{
int b;
cin>>b;
a[b]++;
maxn=max(maxn,b);
}
x=1;
for(int i=1;i<=maxn;i++)
{
if(a[i]!=i*4)
{
x=i;
break;
}
}
int flag1=1,flag2=1;
for(n=1;n<=t;n++)
{
if(t%n!=0)
continue;
m=t/n;
y=n+m-maxn-x;
memset(res,0,sizeof(res));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
res[abs(x-i)+abs(y-j)]++;
}
}
flag1=1;
for(int i=0;i<=maxn;i++)
{
if(res[i]!=a[i])
{
flag1=0;
break;
}
}
if(flag1)
{
cout<<n<<" "<<m<<endl;
cout<<x<<" "<<y<<endl;
flag2=0;
break;
}
}
if(flag2)
cout<<-1<<endl;
return 0;
}