Cod sursa(job #317766)

Utilizator alecmanAchim Ioan Alexandru alecman Data 25 mai 2009 07:14:31
Problema Matrice 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.43 kb
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>

using namespace std;

#define INPUT "matrice2.in"
#define OUTPUT "matrice2.out"
#define pb push_back
#define mp make_pair
#define SET(X) memset(X, 0, sizeof(X))

const int NMAX = 301;

FILE *fin = fopen(INPUT, "r"), *fout = fopen(OUTPUT, "w");

int N, X1, Y1, X2, Y2;
long Q;
int V[ NMAX ][ NMAX ];
bool viz[ NMAX ][ NMAX ];
vector<pair<pair<int, int>, int> > Deq;

void readData()
{
  fscanf(fin, "%d %ld", &N, &Q);
  
  for(int i = 1; i <= N; ++i)
    for(int j = 1; j <= N; ++j)
      fscanf(fin, "%ld", &V[ i ][ j ]);
}

void solve()
{
  SET(viz);
  Deq.clear();
  
  Deq.pb(mp(mp(X1, Y1), 1));
  
  int ok = true;
  long maxim = -1;
  long minim = V[ X1 ][ Y1 ];
  long XP, YP;
  
  vector<pair<pair<int, int>, int> >::iterator it;
  
  long cont = 0;
  
  while(ok && cont < N*N)
  {
    ++cont;
    maxim = V[(*Deq.begin()).first.first][(*Deq.begin()).first.second];
    for(it = Deq.begin(); it != Deq.end(); ++it)
      if(V[(*it).first.first][(*it).first.second] > maxim && (*it).second != 1)
        maxim = V[(*it).first.first][(*it).first.second];
        
    if(maxim < minim) minim = maxim;
    
    for(it = Deq.begin(); it != Deq.end(); ++it)
      if(maxim == V[(*it).first.first][(*it).first.second] && (*it).second != 1) (*it).second = 1, XP = (*it).first.first, YP = (*it).first.second;
      
    fprintf(stderr, "%ld \n", minim);
            
    //Up
    if(!viz[ XP ][ YP-1 ])
    {
      Deq.pb(mp(mp(XP, YP-1), 0));
      if(XP == X2 && YP-1 == Y2)
      {
        fprintf(fout, "%ld\n", minim);
      }
    }
    
    //Down
    if(!viz[ XP ][ YP+1 ])
    {
      Deq.pb(mp(mp(XP, YP+1), 0));
      if(XP == X2 && YP+1 == Y2)
      {
        fprintf(fout, "%ld\n", minim);
      }
    }
    
    //Left
    if(!viz[ XP-1 ][ YP ])
    {
      Deq.pb(mp(mp(XP-1, YP), 0));
      if(XP-1 == X2 && YP == Y2)
      {
        fprintf(fout, "%ld\n", minim);
      }
    }
    
    //Right
    if(!viz[ XP+1 ][ YP ])
    {
      Deq.pb(mp(mp(XP+1, YP), 0));
      if(XP+1 == X2 && YP == Y2)
      {
        fprintf(fout, "%ld\n", minim);
      }
    }
    
    ok = false;
    for(it = Deq.begin(); it != Deq.end(); ++it)
      if((*it).second == 0){ ok = true; break;}
  }
  
  if(cont == N*N) fprintf(fout, "%ld\n", minim);
}

int main()
{
  readData();
  
  for(;Q--;)
  {
    fscanf(fin, "%d %d %d %d", &X1, &Y1, &X2, &Y2);
    solve();
  }
  
  fclose(fin);
  fclose(fout);
  
  return 0;
}