Cod sursa(job #423928)

Utilizator mihaipoascaPoasca Mihai mihaipoasca Data 24 martie 2010 14:01:31
Problema Matrice 2 Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 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 Q,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};
int x[Nmax*Nmax],y[Nmax*Nmax];

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;
	x[1]=x1;y[1]=y1;
	X[x1][y1]=A[x1][y1];
	viz[x1][y1]=1;
	while(li<=lf)
	{
		li++;
		int i,j;
		i=x[li];j=y[li];
		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;
					x[++lf]=ii;
					y[lf]=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;
						x[++lf]=ii;
						y[lf]=jj;
						}
					}
				}
			}
		viz[i][j]=0;
	}

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

}

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