Codeforces Round #495 (Div. 2)D. Sonya and Matrix

题目链接: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;
} 

猜你喜欢

转载自blog.csdn.net/tianyizhicheng/article/details/82596535