Cod sursa(job #254695)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 7 februarie 2009 13:46:22
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 1.88 kb
//varianta 1:super banala daca aceasta nu merge
//varianta 2:  recursivitate
#include<stdio.h>
#include<values.h>
int x2,x1,y1,y2,n,m,mmax,k,i,j;
long a[51][51];

int msus(int x,int y,int m)
{
 while(1)
 {
 x--;
 m++;
 if(x==x2 && y==y2)
    if(mmax>m)
      mmax=m;
 if(a[x][y+1])
     mdreapta(x,y,m);
 if(a[x][y-1])
     mstanga(x,y,m);
if(!a[x-1][y])
   return 0;
 }//while
}
int mjos(int x,int y,int m)
{
while(1)
{
x++;
 m++;
 if(x==x2 && y==y2)
    if(mmax>m)
      mmax=m;
 if(a[x][y+1])
     mdreapta(x,y,m);
 if(a[x][y-1])
     mstanga(x,y,m);
if(!a[x+1][y])
   return 0;
}
}
int mstanga(int x,int y,int m)
{
while(1)
{
y--;
 m++;
 if(x==x2 && y==y2)
    if(mmax>m)
      mmax=m;
 if(a[x-1][y])
     msus(x,y,m);
 if(a[x+1][y])
     mjos(x,y,m);
if(!a[x][y-1])
    return 0;
 }
}
int mdreapta(int x,int y,int m)
{
while(1)
{
 y++;
 m++;
 if(x==x2 && y==y2)
    if(mmax>m)
      mmax=m;
 if(a[x-1][y])
     msus(x,y,m);
 if(a[x+1][y])
     mjos(x,y,m);
if(!a[x][y+1])
   return 0;
}
}
int main ()
{
freopen("kdrum.in","r",stdin);
freopen("kdrum.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
for(i=1;i<=n;i++)
   for(j=1;j<=m;j++)
       scanf("%ld",&a[i][j]);
 //citire

for(i=0;i<=m+1;i++)
   a[0][i]=0;
for(i=1;i<=n+1;i++)
   a[i][m+1]=0;
for(i=m;i>=0;i--)
   a[n+1][i]=0;
for(i=n;i>=1;i--)
   a[i][0]=0;
//bordare

if(a[x1-1][y1])
   msus(x1,y1,0);
if(a[x1+1][y1])
   mjos(x1,y1,0);
if(a[x1][y1+1])
   mdreapta(x1,y1,0);
if(a[x1][y1-1])
   mstanga(x1,y1,0);
//recursivitate
return 0;
}