#include <bits/stdc++.h>
#include "vision.h"

using namespace std;

vector<int> getVisionPattern1d()
{
    return {1,2,1,3,1,1,2};
}
int getMove1d(vector<int> v)
{
    int n=v.size(),put,mijl;
    vector<int> poz[20];
    for(int i=0;i<v.size();i++)
        poz[v[i]].push_back(i);
    mijl=(v.size()-1)/2;
    put=v[mijl];
    if(put==1)
    {
        if(v[mijl+1]==2)
            return mijl+1;
        if(v[mijl-1]==2)
            return mijl-1;
        if(v[mijl+1]==3)
            return mijl+1;
        return mijl-1;
    }
    if(put==2)
    {
        if(v[mijl+2]==3 || v[mijl-2]==3)
        {
            if(v[mijl+2]==3)
                return mijl+2;
            return mijl-2;
        }
        if(v[mijl+2]==2)
            return mijl+2;
        return mijl-2;
    }
    if(put==3)
    {
        if(v[mijl+3]==2)
            return mijl+3;
        return mijl-3;
    }
}
int dx[4]={1,-1,1,-1};
int dy[4]={1,-1,-1,1};
int dx2[4]={0,0,1,-1};
int dy2[4]={1,-1,0,0};
vector<vector<int>> getVisionPattern2d()
{
    vector<vector<int>> trimis;
    vector<int> aux={1,2,1,3,1,1,2};
    int i,j;
    for(i=0;i<aux.size();i++)
    {
        vector<int> a;
        for(j=i;j<aux.size();j++)
            a.push_back(aux[j]);
        for(j=0;j<i;j++)
            a.push_back(aux[j]);
        trimis.push_back(a);
    }
    return trimis;
}
pair<int,int> getMove2d(vector<vector<int>> v)
{
    int mijl=(v.size()-1)/2,put,target,i,xn,yn,dirx,diry;
    put=v[mijl][mijl];
    if(put==3)
    {
        dirx=diry=0;
        target=2;
        for(i=0;i<4;i++)
        {
            xn=mijl+dx[i];
            yn=mijl+dy[i];
            if(v[xn][yn]==target)
            {
                if(dirx==0 && dx[i]!=0)
                    dirx=dx[i];
                if(diry==0 && dy[i]!=0)
                    diry=dy[i];
            }
        }
        return {mijl-dirx,mijl-diry};
    }
    else if(put==2)
    {
        dirx=diry=0;
        target=3;
        for(i=0;i<4;i++)
        {
            xn=mijl+dx[i];
            yn=mijl+dy[i];
            if(v[xn][yn]==target)
            {
                return {xn,yn};
            }
        }

        target=1;
        for(i=0;i<4;i++)
        {
            xn=mijl+dx[i];
            yn=mijl+dy[i];
            if(v[xn][yn]==target)
            {
                return {mijl-dx[i],mijl-dy[i]};
            }
        }
    }
    else if(put==1)
    {
        vector<int> fr(4,0);
        for(i=0;i<4;i++)
        {
            xn=mijl+dx[i];
            yn=mijl+dy[i];
            fr[v[xn][yn]]++;
        }
        if(fr[1]==3 && fr[2]==1)
        {
           target=2;
            for(i=0;i<4;i++)
            {
                xn=mijl+dx[i];
                yn=mijl+dy[i];
                if(v[xn][yn]==target)
                {
                    return {mijl+dx[i],mijl+dy[i]};
                }
            }
        }
        else if(fr[3]==1 && fr[1]==3)
        {
            target=3;
            for(i=0;i<4;i++)
            {
                xn=mijl+dx[i];
                yn=mijl+dy[i];
                if(v[xn][yn]==target)
                {
                    return {mijl-dx[i],mijl-dy[i]};
                }
            }
        }
        else if(fr[1]==4)
        {
            dirx=diry=0;
            target=3;
            for(i=0;i<4;i++)
            {
                xn=mijl+dx2[i];
                yn=mijl+dy2[i];
                if(v[xn][yn]==target)
                {
                    if(dirx==0 && dx2[i]!=0)
                        dirx=dx2[i];
                    if(diry==0 && dy2[i]!=0)
                        diry=dy2[i];
                }
            }
            if(dirx==0 && diry==0)
                dirx=1;
            return {mijl+dirx,mijl+diry};
        }
    }
}
