Cod sursa(job #278165)

Utilizator jupanubv92Popescu Marius jupanubv92 Data 12 martie 2009 09:50:52
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.04 kb
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int a[101][101];
int b[101][101];
int n,K;
const int dx[]={-1,0,1},
          dy[]={-1,-1,-1};

void solve(int pz)
{
    for (int j=1;j<=n;j++)
    {
        for (int i=pz+j-1;i>=1&&i>=pz-j+1;i--)
        {
            b[i][j]=a[i][j];
            for (int k=0;k<3;k++)
            {
                int ii=i+dx[k];
                int jj=j+dy[k];
                if (ii<1||ii>n) continue;
                if (jj<1||jj>n) continue;
                if (b[ii][jj]+a[i][j]>b[i][j])
                    b[i][j]=b[ii][jj]+a[i][j];
            }
        }
    }
}

void reconst(int i,int j,int sum)
{
    if(j==1) return ;
     else
    for (int k=0;k<3;k++)
    {
        int ii=i+dx[k];
        int jj=j-1;
        if (ii<1||ii>n) continue;
        if (jj<1||jj>n) continue;
        if(b[ii][jj]==b[i][j]-a[i][j])
          {
           reconst(ii,jj,sum-a[i][j]);
           printf("%d ",ii);
           return ;
          }
    }
}

int main()
{
    freopen("biblica.in","r",stdin);
    freopen("biblica.out","w",stdout);
    scanf("%d %d",&n,&K);
    for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++)
            scanf("%d",&a[i][j]);
    solve();
    return 0;
}

/*
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int a[101][101];
int b[101][101];
int n,K;
const int dx[]={-1,0,1},
               dy[]={-1,-1,-1};

void solve(int pz)
{
    for (int j=1;j<=n;j++)
    {
        for (int i=pz+j-1;i>=1&&i>=pz-j+1;i--)
        {
            b[i][j]=a[i][j];
            for (int k=0;k<3;k++)
            {
                int ii=i+dx[k];
                int jj=j+dy[k];
                if (ii<1||ii>n) continue;
                if (jj<1||jj>n) continue;
                if (b[ii][jj]+a[i][j]>b[i][j])
                    b[i][j]=b[ii][jj]+a[i][j];
            }
        }
    }
}

void reconst(int i,int j,int sum)
{
    if(j==1) return ;
     else
    for (int k=0;k<3;k++)
    {
        int ii=i+dx[k];
        int jj=j-1;
        if (ii<1||ii>n) continue;
        if (jj<1||jj>n) continue;
        if(b[ii][jj]==b[i][j]-a[i][j])
          {
           reconst(ii,jj,sum-a[i][j]);
           printf("%d ",ii);
           return ;
          }
    }
}
int main()
{
    freopen("biblica.in","r",stdin);
    freopen("biblica.out","w",stdout);
    scanf("%d %d",&n,&K);
    for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++)
            scanf("%d",&a[i][j]);
    for (int i=1;i<=n;i++)
    {
        solve(i);
        int max=-1,pzi=0,pzj=0;
        for (int k=0;k<3;k++)
        {
            int ii=K+dx[k];
            int jj=n;
            if (ii<1||ii>n) continue;
            if (jj<1||jj>n) continue;
            if (b[ii][jj]>max)
            {
                max=b[ii][jj];
                pzi=ii;
                pzj=jj;
            }
        }
        printf("%d ",max);
        reconst(pzi,pzj,max);
        printf("%d \n",pzi);
        memset(b,0,(sizeof b));
    }
    return 0;
}
*/