Cod sursa(job #320666)

Utilizator warangeldinu sorin warangel Data 5 iunie 2009 13:50:29
Problema Matrice 2 Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include<cstdio>
#include<string.h>
long mat[305][305],din[305][305],n,q,cx[90005],cy[90005],cv[90005],csel[90005],cs,ce,done,dsel[305][305];
int crdx[]={1,-1,0,0};
int crdy[]={0,0,1,-1};
inline int valid(int nr)
{
	if(nr<1)return 0;
	else if(nr>n)return 0;
	else return 1;
}
void fill(int x,int y,int wx,int wy)
{
	int i,nx,ny;
	if(x==wx&&y==wy||done){done=1;return;}
	for(i=0;i<4;i++)if(valid(crdx[i]+x)&&valid(crdy[i]+y)&&!dsel[crdx[i]+x][crdy[i]+y])
	{
		nx=crdx[i]+x;
		ny=crdy[i]+y;
		dsel[nx][ny]=1;
		if(din[nx][ny]>din[x][y])
		{
			din[nx][ny]=din[x][y];
			fill(nx,ny,wx,wy);
		}
		else 
		{
			//addq(nx,ny);
			ce++;
			cv[ce]=din[nx][ny];
			cx[ce]=nx;
			cy[ce]=ny;
		}
	}
}
void rezolva(int x1,int y1,int x2,int y2)
{
	int max,maxp,i;
	memmove(din,mat,sizeof(mat));
	memset(cx,0,sizeof(cx));
	memset(cy,0,sizeof(cy));
	memset(csel,0,sizeof(csel));
	memset(dsel,0,sizeof(dsel));
	done=cs=ce=0;
	cx[0]=x1;
	cy[0]=y1;
	cv[0]=din[x1][y1];
	while(cs<=ce)
	{
		max=0;
		for(i=0;i<=ce;i++)if(!csel[i])
			if(cv[i]>max){maxp=i;max=cv[i];}
		csel[maxp]=1;
		fill(cx[maxp],cy[maxp],x2,y2);
		if(done)return;
		cs++;
	}
}
int main()
{
	int i,j,x1,x2,y1,y2;
	freopen("matrice2.in","r",stdin);
	freopen("matrice2.out","w",stdout);
	scanf("%ld %ld",&n,&q);
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)scanf("%ld",&mat[i][j]);
	while(q--)
	{
		scanf("%ld %ld %ld %ld",&x1,&y1,&x2,&y2);
		rezolva(x1,y1,x2,y2);
		printf("%ld\n",din[x2][y2]);
	}
	return 0;
}