Cod sursa(job #327046)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 26 iunie 2009 22:56:30
Problema Matrice 2 Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

#define file_in "matrice2.in"
#define file_out "matrice2.out"

#define Nmax 310
#define Inf 0x3f3f3f3f

int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};

int n,m;
int a[Nmax][Nmax];
int x1,y1,x2,y2;
char viz[Nmax][Nmax];
int cost[Nmax][Nmax];
int x[Nmax*Nmax],y[Nmax*Nmax];

int bfs(int x1, int y1, int x2, int y2)
{
	int xx,yy,lne,cne;
	int p,u;
	
	memset(cost,0,sizeof(cost));
	memset(viz,0,sizeof(viz));
	cost[x1][y1]=a[x1][y1];
	viz[x1][y1]=1;
	p=0;
	u=0;
	x[0]=x1;
	y[0]=y1;
	
	while(p<=u)
	{
		xx=x[p];
		yy=y[p];
		viz[xx][yy]=0;
		for (int k=0;k<4;++k)
		{
			lne=xx+dx[k];
			cne=yy+dy[k];
			if (lne>=1 && lne<=n && cne>=1 && cne<=n)
				if (cost[lne][cne]<min(a[lne][cne],cost[xx][yy]))
				{
					cost[lne][cne]=min(a[lne][cne],cost[xx][yy]);
					if (!viz[lne][cne])
					{
						viz[lne][cne]=1;
					    u++;
					    x[u]=lne;
					    y[u]=cne;
					}
				}
		}
		p++;
	}
	
	return cost[x2][y2];
}

int main()
{
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d", &n,&m);
	for (int i=1;i<=n;++i)
		 for (int j=1;j<=n;++j)
			  scanf("%d", &a[i][j]);
	
    while(m--)
    {
		scanf("%d %d %d %d", &x1,&y1,&x2,&y2);
		printf("%d\n", bfs(x1,y1,x2,y2));
	}
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}