Cod sursa(job #1105611)

Utilizator Juve45UAIC Alexandru Ionita Juve45 Data 11 februarie 2014 21:52:54
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.9 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>

using namespace std;

#define pb push_back
#define dmax 1024
#define x first
#define y second

FILE *f=fopen("alpin.in", "r");
FILE *g=fopen("alpin.out", "w");


int n;
int m[dmax][dmax];
vector <int> v[dmax*dmax];
int maxm;
typedef pair <short int, short int> pi;


void parse(int x)
{
    char c[6*dmax], *p;
    fgets(c, 6*dmax, f);

    p=strtok(c, " \n");
    int lg;
    int i=0;
    while(p)
    {
        lg=strlen(p);
        for(int ii=0; ii<lg; ii++)
            m[x][i]=m[x][i]*10+*(p+ii)-'0';

    p=strtok(NULL, " \n");
    i++;
    }

}

void  read()
{
    //freopen("alpin.in", "r", stdin);
    //freopen("alpin.out", "w", stdout);
    fscanf(f,"%i", &n);
    fgetc(f);
    for(int i=0; i<n; i++)
        //  for(int ii=0; ii<n; ii++)
        //    scanf("%i", &m[i][ii]);
        parse(i);
    return;
}

void make_graph()
{
    for(int i=0; i<n-1; i++)
        for(int ii=0; ii<n-1; ii++)
        {
            if(m[i][ii]<m[i][ii+1])
                v[i*n+ii].pb(i*n+ii+1);
            else if(m[i][ii]>m[i][ii+1])
                v[i*n+ii+1].pb(i*n+ii);
            else
            {
                v[i*n+ii].pb(i*n+ii);
                v[i*n+ii+1].pb(i*n+ii+1);

            }

            if(m[i][ii]<m[i+1][ii])
                v[i*n+ii].pb((i+1)*n+ii);
            else if(m[i][ii]>m[i+1][ii])
                v[(i+1)*n+ii].pb(i*n+ii);
            else
            {
                v[i*n+ii].pb(i*n+ii);
                v[(i+1)*n+ii].pb((i+1)*n+ii);

            }

        }

    int i=n-1;
    for(int ii=0; ii<n-1; ii++)
    {
        if(m[i][ii]<m[i][ii+1])
            v[i*n+ii].pb(i*n+ii+1);
        else if(m[i][ii]>m[i][ii+1])
            v[i*n+ii+1].pb(i*n+ii);
        else
        {
            v[i*n+ii].pb(i*n+ii);
            v[i*n+ii+1].pb(i*n+ii+1);

        }

    }
    int ii=n-1;
    for(int i=0; i<n-1; i++)
    {

        if(m[i][ii]<m[i+1][ii])
            v[i*n+ii].pb((i+1)*n+ii);
        else if(m[i][ii]>m[i+1][ii])
            v[(i+1)*n+ii].pb(i*n+ii);
        else
        {
            v[i*n+ii].pb(i*n+ii);
            v[(i+1)*n+ii].pb((i+1)*n+ii);

        }

    }

}

void toposort(int x, int val)
{
    m[x/n][x%n]=val;

    for(int i=0; i<v[x].size(); i++)
    {
        if(m[v[x][i]/n][v[x][i]%n]<m[x/n][x%n]+1 && v[x][i]!=x)
        {
            toposort(v[x][i], val+1);
            if(m[v[x][i]/n][v[x][i]%n]>m[maxm/n][maxm%n])
                maxm=v[x][i];
        }
    }

}

void redefine_0()
{
    for(int i=0; i<=n; i++)
        for(int ii=0; ii<=n; ii++)
            m[i][ii]=0;

}

bool con(int a, int b)
{
    for(int i=0; i<v[a].size(); i++)
    {
        if(v[a][i]==b)
            return true;
    }
    return false;
}


void way_back(int x)
{

    int i=m[x/n][x%n];

    int y = x%n;
    x=x/n;
if(i==1)
{
fprintf(g,"%i %i\n", x+1, y+1);
}
else{
        i--;
    int dl[]= {1, 0, -1, 0};
    int dc[]= {0, 1, 0, -1};

        for(int ii=0; ii<4; ii++)
        {
            if(m[x+dl[ii]][y+dc[ii]]==i && con((x+dl[ii])*n+y+dc[ii], x*n+y))
            {
                way_back((x+dl[ii])*n+y+dc[ii]);
                fprintf(g,"%i %i\n", x+1, y+1);
break;
            }
        }

}
}
bool validate(int x)
{
    if(v[x].size()==4)
        return true;

    if(x/n==0 || x/n==n-1 || x%n==0 || x%n==n-1)
        if(v[x].size()==3)
            return true;

    if((x/n==0 || x/n==n-1) && (x%n==0 || x%n==n-1))
        if(v[x].size()==2)
            return true;

    return false;
}


int main()
{
    read();
    make_graph();
    redefine_0();
    for(int i=0; i<n*n; i++)
    {
        if(validate(i))
            toposort(i, 1);
    }

    fprintf(g, "%i\n", m[maxm/n][maxm%n]);

    way_back(maxm);
    return 0;
}