Cod sursa(job #254475)

Utilizator nusmaibunkeleviprofesor cicalescu nusmaibunkelevi Data 7 februarie 2009 12:21:17
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 1.37 kb
#include<stdio.h>
#define NM 50

int A[NM][NM],n,m,ck,x1,y1,x2,y2,lmin,nn;
int st[NM*NM+1],stc[NM*NM+1],viz[NM*NM+1],v[NM*NM+1];
int pozi,poz,l,c;

int valid(int k){
if(poz==-1||viz[poz]==1||v[poz]==0) return 0;
return 1;
}

void sol(int k){
int i,pr=1,ok=0;
for(i=0;i<=k&&!ok;++i){
	pr*=stc[i]%ck;
	if(pr>ck) pr%=ck;
	if(pr==0)ok=1;
	}
if(ok&&k<lmin) lmin=k;
}

void bkt(){
int k,up,lt,ct,pozt;
k=0;stc[k]=pozi;st[k]=0;viz[poz]=1;
while(k>=0){
	up=0;
	while(!up&&st[k]<4){
		st[k]++;
		lt=l,ct=c,pozt=poz;
		switch(st[k]){
			case 1:l--;break;
			case 2:c++;break;
			case 3:l++;break;
			case 4:c--;
			}
		//poz=1 inseamna iesit afara
		if(l<0||c<0||l==n||c==m) poz=-1;
		else poz=c+l*n;
		if(valid(k)) {up=1;viz[poz]=1;}
		else {l=lt,c=ct,poz=pozt;}
		}
	if(up)
		if(l==y2-1&&c==x2-1){
			sol(k);
			viz[poz]=0;
			l=lt,c=ct,poz=pozt;
			}
		else
			if(k==lmin) goto back;
			else {k++,st[k]=0,stc[k]=poz;}
	else{
		back:
		viz[poz]=0,k--;
		l=stc[k]/n,c=stc[k]%n;
		poz=l*n+c;
		}
	}
}

int main(){
freopen("kdrum.in","r",stdin);
freopen("kdrum.out","w",stdout);
int i,j;
scanf("%d%d%d",&n,&m,&ck);
lmin=n*m;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
c=x1-1;l=y1-1;
poz=pozi=l*n+c;
for(i=0;i<n;++i)
	for(j=0;j<m;++j) {
		scanf("%d",&A[i][j]);
		v[i*n+j]=A[i][j];
		if(A[i][j]) nn++;
		}
bkt();
printf("%d",lmin+2);
return 0;
}