Cod sursa(job #254513)

Utilizator Bogdan_tmmTirca Bogdan Bogdan_tmm Data 7 februarie 2009 12:36:42
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 1.17 kb
#include<iostream>
#include<stdio.h>
FILE *f=fopen("kdrum.in","r"),*g=fopen("kdrum.out","w");
int x[]={0,0,1,-1},y[]={1,-1,0,0},x_start,y_start,x_finish,y_finish;
int a[53][53],k,n,m,i,j;long lng=1,k1=1,min=2000000;int dir;
int valid(int dir,int dir1)
{
	if(dir==0&&dir1==1) return 0;
	if(dir==1&&dir1==0) return 0;
	if(dir==2&&dir1==3) return 0;
	if(dir==3&&dir1==2) return 0;
	return 1;
}
void back(int x1,int y1)
{
	int lng1,xval,k2,x2,y2,dir1;
	for(xval=0;xval<4;xval++)
	{
		x2=x1+x[xval];
		y2=y1+y[xval];
		dir1=dir;
		dir=xval;
		if(a[x2][y2]&&lng+1<min&&valid(dir,dir1))
		{
			lng1=lng++;
			k2=k1;
			k1=(k1*a[x2][y2])%k;
			if(x2==x_finish&&y2==y_finish&&!k1)
			{
				if(lng<min) 
				{
					min=lng;
					lng=lng1;
					k1=k2;
				}
			}
			else
			{
				back(x2,y2);
				lng=lng1;
				k1=k2;
			}
		}
		dir=dir1;
	}
}
int main()
{
	fscanf(f,"%d%d%d%d%d%d%d",&n,&m,&k,&x_start,&y_start,&x_finish,&y_finish);
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			fscanf(f,"%d",&a[i][j]);
	for(i=0;i<=n+1;i++)
		a[i][0]=a[i][n+1]=0;
	for(i=0;i<=m+1;i++)
		a[0][i]=a[m+1][i]=0;
	back(x_start,y_start);
	fprintf(g,"%ld\n",min);
	return 0;
}