Cod sursa(job #423936)

Utilizator mihaipoascaPoasca Mihai mihaipoasca Data 24 martie 2010 14:12:19
Problema Matrice 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<fstream>
using namespace std;
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
#define Nmax 310
#define min(a,b) (a<b?a:b)
int T,N,A[Nmax][Nmax];
int x1,x2,y1,y2;
int X[Nmax][Nmax],viz[Nmax][Nmax];
int dx[]={1,0,-1,0},
	dy[]={0,1,0,-1};
struct nod{int x,y;nod* next;};
typedef nod *lista;
lista Q,Qf;
void clear()
{
	for(int i=1;i<=N;i++)
		for(int j=1;j<=N;j++)
			X[i][j]=viz[i][j]=0;
}

int valid(int i,int j)
{
	return i && j && i<=N && j<=N;
}

void solve()
{
	clear();
	int li=0,lf=1;
	Q=Qf=new nod;
	Q->x=x1;Q->y=y1;
	X[x1][y1]=A[x1][y1];
	viz[x1][y1]=1;
	while(Q)
	{
		int i,j;
		i=Q->x;j=Q->y;
		for(int k=0;k<4;k++)
			if(valid(i+dx[k],j+dy[k]))
			{
				int ii=i+dx[k],jj=j+dy[k];
				if(X[ii][jj]==0)
				{
					X[ii][jj]=min(A[ii][jj],X[i][j]);
					viz[ii][jj]=1;
					Qf->next=new nod;
					Qf=Qf->next;
					Qf->x=ii;
					Qf->y=jj;
				}
				else
				{
					if(min(A[ii][jj],X[i][j])>X[ii][jj])
					{
						X[ii][jj]=min(A[ii][jj],X[i][j]);
						if(viz[ii][jj]==0)
						{
							viz[ii][jj]=1;
							Qf->next=new nod;
							Qf=Qf->next;
							Qf->x=ii;
							Qf->y=jj;
						}
					}
				}
			}
		viz[i][j]=0;
		lista aux=Q;
		Q=Q->next;
		delete aux;
	}

	fout<<X[x2][y2]<<"\n";

}

int main()
{
	fin>>N>>T;
	for(int i=1;i<=N;i++)
		for(int j=1;j<=N;j++)
			fin>>A[i][j];
	while(T--)
	{
		fin>>x1>>y1>>x2>>y2;
		solve();
	}
}