Cod sursa(job #434409)

Utilizator niovanIovan Alexandru niovan Data 5 aprilie 2010 20:49:56
Problema Matrice 2 Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include<fstream>
#define min(x,y) (x<y? x:y);
using namespace std;

fstream fin("matrice2.in",ios::in);
fstream fout("matrice2.out",ios::out);

struct Coada{int x,y; Coada *urm;};
struct poz{int x,y;};

int n,*A[301];
int *C[301],Q;
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};


void Citire()
{
	int i,j;
	fin>>n>>Q;
	for(i=1;i<=n;i++)
	{
		C[i]=(int*)calloc(n,sizeof(int));
		A[i]=(int*)calloc(n,sizeof(int));
	}
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			fin>>A[i][j];
}

void Init()
{
	int i,j;
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			C[i][j]=0;
}

void Rezolvare()
{
	poz I,F;
	int i,x,y,xnou,ynou;
	bool plasat;
	Coada *prim,*ultim,*p,*cont;
	while(Q--)
	{
		fin>>I.x>>I.y>>F.x>>F.y;
	prim=new Coada;
	ultim=prim;
	prim->x=I.x;
	prim->y=I.y;
	prim->urm=NULL;
		Init();	
		C[I.x][I.y]=A[I.x][I.y];
		
	
	while(prim!=NULL&&!C[F.x][F.y])
		{
			x=prim->x;
			y=prim->y;
			for(i=0;i<4;i++)
			{
				xnou=x+dx[i];
				ynou=y+dy[i];
				if(xnou>0&&ynou>0&&xnou<=n&&ynou<=n&&!C[xnou][ynou])
				{
					C[xnou][ynou]=min(C[x][y],A[xnou][ynou]);
				//plasam in valoarea in coada;
					plasat=false;
					p=new Coada;
					p->x=xnou;
					p->y=ynou;
					p->urm=NULL;
					cont=prim;
				if(C[ultim->x][ultim->y]>=C[p->x][p->y])
				{
					ultim->urm=p;
					ultim=p;
					plasat=true;
				}
				while(cont->urm!=NULL&&!plasat)
				{
					if(C[p->x][p->y]>=C[cont->urm->x][cont->urm->y]&&C[p->x][p->y]<=C[cont->x][cont->y])
					{
						p->urm=cont->urm;
						cont->urm=p;
						plasat=true;
					}
					cont=cont->urm;
				}
				
				}
			}
		p=prim;
		prim=prim->urm;
		delete p;
		}
		fout<<C[F.x][F.y];
		if(Q) fout<<endl;
	}
		
}

int main()
{
	Citire();
	Rezolvare();
	return 0;
}