Cod sursa(job #2221203)

Utilizator Tudor31Tudose Tudor-Cristian Tudor31 Data 13 iulie 2018 14:22:04
Problema Algoritmul lui Euclid Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 4.13 kb
#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;

int dx[4]={0, 0, 1, -1};
int dy[4]={1, -1, 0, 0};

void Citire(int m[102][102], int &n)
{
    ifstream f("lacuri.in");
    f>>n;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
        {
            f>>m[i][j];
        }
    }
    f.close();
}

void Bordare(int m[102][102], int n)
{
    for(int i=0; i<=n+1; i++)
    {
        m[0][i]=-1;
        m[n+1][i]=-1;
        m[i][0]=-1;
        m[i][n+1]=-1;
    }
}

void Afisare(int m[102][102], int n)
{
    for(int i=0; i<=n+1; i++)
    {
        for(int j=0; j<=n+1; j++)
        {
            cout<<setw(3)<<m[i][j];
        }
        cout<<endl;
    }
    cout<<endl;
}

int VerificareInterior(int m[102][102], int i, int j, int cnt)
{
//    cout<<"i - "<<i<<endl;
//    cout<<"j - "<<j<<endl;
//    cout<<"cnt - "<<cnt<<endl;
    int i1=i; int j1=j;
    for(i=i1; i<=i1+cnt; i++)
    {
        for(j=j1; j<=j1+cnt; j++)
        {
            if(m[i][j]!=1)
            {
                return 0;
            }
            else
            {
                m[i][j]=-2;
            }
        }
    }
    return 1;
}
int VerificareExterior(int m[102][102], int i, int j, int cnt)
{
    int i1=i;
    int j1=j;
    for(i; i<=i1+cnt+2; i++)
    {
        if(m[i][j]==1 || m[i][j+cnt+2]==1)
        {
            return 0;
        }
    }
    i=i1;
    for(j; j<=j1+cnt+2; j++)
    {
        if(m[i][j]==1 || m[i+cnt+2][j]==1)
        {
            return 0;
        }
    }
    return 1;
}

int VerificareLacPatrat(int m[102][102], int i, int j)
{
    int j1=j;
    int i1=i;
    int cnt1=0;
    int cnt2=0;
    while(m[i][++j]==1)
    {
        cnt1++;
    }
    j=j1;
    while(m[++i][j]==1)
    {
        cnt2++;
    }
    i=i1;
    if(cnt1==cnt2)
    {
        if(VerificareInterior(m, i, j, cnt1))
        {
            if(VerificareExterior(m, i-1, j-1, cnt1))
            {
                return 1;
            }
        }
    }
    return 0;
}

void StergereLacNePatrat(int m[102][102], int i, int j)
{
    int x, y;
    m[i][j]=-2;
    for(int k=0; k<4; k++)
    {
        x=i+dx[k];
        y=j+dy[k];
        if(m[x][y]==1)
        {
            StergereLacNePatrat(m, x, y);
        }
    }
}

int NumarLacuriPatrate(int m[102][102], int n, int &t)
{
    int nr=0;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
        {
            if(m[i][j]==1)
            {
                if(VerificareLacPatrat(m, i, j))
                {
                    nr++;
                }
                else
                {
                    t=0;
                    StergereLacNePatrat(m, i, j);
                }
            }
        }
    }
    return nr;
}

void Drum(int m[102][102], int n)
{
    ofstream g("lacuri.out");
    int t=1;
    g<<NumarLacuriPatrate(m, n, t)<<endl;
    if(t==1)
    {
        int c[2][102*102], p, u, x, y, x1, y1;
        c[0][0]=n;
        c[1][0]=n;
        p=0; u=1;
        m[n][n]=1;
        while(p<u)
        {
            x=c[0][p];
            y=c[1][p];
            for(int k=0; k<4; k++)
            {
                x1=x+dx[k];
                y1=y+dy[k];
                if(m[x1][y1]==0)
                {
                    c[0][u]=x1;
                    c[1][u]=y1;
                    m[x1][y1]=m[x][y]+1;
                    u++;
                }
            }
            p++;
        }
        x=1; y=1;
        int stop;
        while(x!=n || y!=n)
        {
            stop=0;
            g<<x<<" "<<y<<endl;
            for(int k=0; k<4 && stop==0; k++)
            {
                x1=x+dx[k];
                y1=y+dy[k];
                if(m[x1][y1]==m[x][y]-1)
                {
                    x=x1;
                    y=y1;
                    stop=1;
                }
            }
        }
        g<<n<<" "<<n<<endl;
    }

    g.close();
}


int main()
{
    int m[102][102], n;
    Citire(m, n);
    Bordare(m, n);
    Drum(m, n);

    return 0;
}