Cod sursa(job #433532)

Utilizator dornescuvladVlad Eugen Dornescu dornescuvlad Data 3 aprilie 2010 20:01:38
Problema Kdrum Scor 0
Compilator cpp Status done
Runda pregatire_nationala Marime 1.79 kb
#include<iostream>
#include<fstream>

using namespace std;

ifstream fin("kdrum.in");
ofstream fout("kdrum.out");

int N,M,K,i;
int dx[]={-1,0,1,0}, dy[]={0,1,0,-1};
int qi[60000],qj[60000],prod,minim=25000;
int A[52][52],xstart,ystart,xfinal,yfinal,j,L[52][52],first,last,O[52][52],inou,jnou;

void read()
{
	fin>>N>>M>>K;
	fin>>xstart>>ystart;
	fin>>xfinal>>yfinal;
	for(i=1;i<=N;i++)
		for(j=1;j<=M;j++)
			fin>>A[i][j];
}

void bordeaza()
{
	for(i=0;i<=N+1;i++)
	{
		A[i][0]=-1;
		A[i][M+1]=-1;
	}
	for(j=0;j<=M+1;j++)
	{
		A[0][j]=-1;
		A[N+1][j]=-1;
	}
}

void solve()
{	
	int pas = 0;
	int prod = 1;
	for(i=1;i<=N;i++)
		for(j=1;j<=M;j++)
			if(L[i][j]==2)
			{	
				pas++;
				prod*=A[i][j];
			}
	if(prod % K == 0)
		if(pas < minim)
		{
			minim = pas;
			fout<<minim;
		}
}

int ct = 0;
	
void cauta(int x, int y)
{	
	L[x][y]=2;
	if(x==xfinal && y==yfinal)
		solve();
	else
		if(minim==25000)
			for(int dir=0;dir<4;dir++)
				if(L[x+dx[dir]][y+dy[dir]]==0 && A[x+dx[dir]][y+dy[dir]]!=-1 && (x+dx[dir]<=N && y+dy[dir]<=M) && (x+dx[dir]>=1 && y+dy[dir]>=1))
					cauta(x+dx[dir], y+dy[dir]);
	L[x][y]=0;
}

int isempty()
{ 
	if (first == last)
		return 1;
	else return 0;
}


int main()

{
	read();
	bordeaza();
	//cauta(xstart,ystart);



	for(i=0;i<=N+1;i++)
		for(j=0;j<=M+1;j++)
			O[i][j]=N*M;
	O[xstart][ystart]=1;
	qi[last]=xstart;
	qj[last]=ystart;
    last++;
	
	while(first<last)
	{
		i=qi[first];
		j=qj[first];
		first++;
		
		for(int k=0;k<4;k++)
		{
			inou=i+dx[k];
			jnou=j+dy[k];
			if(A[inou][jnou]==0)
				if(O[inou][jnou]>O[i][j]+1)
				{
					O[inou][jnou]=O[i][j]+1;
					qi[last]=inou;
					qj[last]=jnou;
					last++;
				}
		}
	}
	fout<<O[xfinal][yfinal];
	return 0;
}