Cod sursa(job #197836)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 6 iulie 2008 16:55:32
Problema Prefix Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
# include <stdio.h>
# include <stdlib.h>

using namespace std;

# define FIN "poarta.in"
# define FOUT "poarta.out"
# define MAXN 1001
# define inf 101

int N,M,K,i,j;
int min,mini,minf;
int aux,x,y,ct1,ct2;
int xi,yi,xf,yf;
int P[inf][inf];

    int main()
    {
        freopen(FIN,"r",stdin);
        freopen(FOUT,"w",stdout);
        
        scanf("%d%d%d",&N,&M,&K);
        scanf("%d%d",&xi,&yi);
        scanf("%d%d",&xf,&yf);
        
        min=abs(xf-xi)+abs(yf-yi);
        
        for (i = 1; i <= N; ++i)
          P[i][1]=1;
        for (i = 1; i <= M; ++i)
          P[1][i]=1;
        for (i = 2; i <= N; ++i)
          for (j = 2; j <= M; ++j)
            P[i][j]=(P[i-1][j]+P[i][j-1])%997;
            
        mini = minf = MAXN;
        ct1 = ct2 = 0;
        for (i = 1; i <= K; ++i)
          {
              scanf("%d%d",&x,&y); 
              aux=abs(xi-x)+abs(yi-y);
              if (aux<mini) 
                {
                   mini=aux;
                   ct1=P[abs(xi-x)+1][abs(yi-y)+1];
                }
              else
                if (aux==mini)
                  ct1+=P[abs(xi-x)+1][abs(yi-y)+1];
              aux=abs(xf-x)+abs(yf-y);
              if (aux<minf) 
                {
                   minf=aux;
                   ct2=P[abs(xf-x)+1][abs(yf-y)+1];
                }
              else
                if (aux==minf)
                  ct2+=P[abs(xf-x)+1][abs(yf-y)+1];
          }
        
        if (mini+minf+1<min) 
          {
              min=mini+minf+1;
              printf("%d\n%d",min,(ct1*ct2)%997);
          }
        else
          printf("%d\n%d",min,P[abs(xf-xi)+1][abs(yf-yi)+1]%997);
    
        return 0;        
    }