Cod sursa(job #322945)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 10 iunie 2009 13:43:11
Problema Matrice 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include <stdio.h>
#define N  305

using namespace std;

const int x[5]={-1,0,0,1};
const int y[5]={0,-1,1,0};

struct nod
{
	int l,c,ind;
	nod *next;
}*mat[N][N];

int n,q,xi,xf,yi,yf,inc,sf;
int rez[N][N];
int cost[N][N];
int Qx[5*N*N];
int Qy[5*N*N];
int viz[N][N];
int rezultat[20010];


void citire()
{
	freopen ("matrice.in","r",stdin);
	freopen ("matrice.out","w",stdout);
	scanf ("%d %d",&n,&q);
	for (int i=1;i<=n;i++)
		for (int j=1;j<=n;j++)
		{
			scanf ("%d",&cost[i][j]);
			mat[i][j]=NULL;
		}

}

void baga(int i)
{
	nod *q=new nod;
	q->l=xf;
	q->c=yf;
	q->ind=i;
	q->next=mat[xi][yi];
	mat[xi][yi]=q;
}


void solve()
{
	for (int i=0;i<q;i++)
	{
		scanf ("%d %d %d %d",&xi,&yi,&xf,&yf);
		baga(i);
	}
}

int mini(int a,int b)
{
	return a<b?a:b;
}

int maxi(int a,int b)
{
	return a>b?a:b;
}

void calc(int l1,int c1)
{
	
	for (int i=1;i<=n;i++)
			for (int j=1;j<=n;j++)
					rez[i][j]=0;
	int L,C,L1,C1;
	inc=0;
	sf=1;
	Qx[0]=l1;
	Qy[0]=c1;
	viz[l1][c1]=1;
	rez[l1][c1]=cost[l1][c1];
	for (int i=0;i<sf;i++)
	{
		L=Qx[i];
		C=Qy[i];
		viz[L][C]=0;
		for (int k=0;k<4;k++)
		{
			L1=L+x[k];
			C1=C+y[k];
			if (cost[L1][C1]!=0)
			{
				if (rez[L1][C1]==0)
				{
					rez[L1][C1]=mini(rez[L][C],cost[L1][C1]);
					Qx[sf]=L1;
					Qy[sf++]=C1;
				}
				else
				{
					if (mini(rez[L][C],cost[L1][C1])>rez[L1][C1])
					{
						rez[L1][C1]=mini(rez[L][C],cost[L1][C1]);
						if (!viz[L1][C1])
						{
							viz[L1][C1]=1;
							Qx[sf]=L1;
							Qy[sf++]=C1;
						}
					}
				}
			}
		}
	}
	
	
	for (nod *q=mat[l1][c1];q;q=q->next)
		rezultat[q->ind]=rez[q->l][q->c];
}


void afisare()
{
	for (int i=0;i<=n+1;i++)
			for (int j=0;j<=n+1;j++)
					viz[i][j]=0;

	for (int i=1;i<=n;i++)
			for (int j=1;j<=n;j++)
			if (mat[i][j]!=NULL)
			{
				calc(i,j);
			}
	
	for (int i=0;i<q;i++)
			printf("%d\n",rezultat[i]);
}

int main()
{
	citire();
	solve();
	afisare();
	return 0;
}