Pagini recente » Cod sursa (job #2871085) | Cod sursa (job #57449) | Cod sursa (job #1202963) | Cod sursa (job #1194824) | Cod sursa (job #1105611)
#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;
}