Cod sursa(job #932332)

Utilizator robertstrecheStreche Robert robertstreche Data 28 martie 2013 20:49:51
Problema Frac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <fstream>

using namespace std;

ifstream f("lacuri.in");
ofstream g("lacuri.out");
int n,i,j,lc,y[101],nr,ii,jj,dim,okk,q=1,xx[1000],yy[1000],dx[9]={0,-1,0,1,1,1,0,-1,-1},dy[9]={0,-1,-1,-1,0,1,1,1,0},cc,x[101],l,c,p,u,a[101][101],b[101][101];
int lat(int i, int j)
{int p=0;
 while(a[i][j+p]&&j+p<=n)p++;
 return p;
}
int verif(int i, int j, int dim)
{int ii, jj,r=1;
 for(ii=i;ii<=i+dim-1;ii++)
    for(jj=j;jj<=j+dim-1;jj++)
        if(a[ii][jj]==0)r=0;else if (a[ii-1][jj-1]==2  || a[ii-1][jj]==2  || a[ii-1][jj+1]==2  || a[ii][jj+1]==1  || a[ii+1][jj+1]==1  || a[ii+1][jj]==1 || a[ii+1][jj-1]==1 || a[ii][jj-1]==2)a[ii][jj]=2;
 if (r==0)return 0;
 for(jj=j-1;jj<=j+dim;jj++)
    {if(a[i-1][jj])return 0;
     if(a[dim+i][jj])return 0;
    }

for(ii=i-1;ii<=i+dim;ii++)
    {if(a[ii][j-1])return 0;
     if(a[ii][j+dim])return 0;
    }
 return 1;
}
int ok(int l,int c)
{
    if (l<=n && l>0 && c<=n && c>0)return 1;
    else return 0;
}
int main()
{



    f>>n;
    for (i=1;i<=n;i++)
      for (j=1;j<=n;j++)f>>a[i][j];
      for (i=1;i<=n;i++)
      for (j=1;j<=n;j++)
      {
      if(a[i][j]==1){
        dim=lat(i,j);
        okk=verif(i,j,dim);
        if(okk)nr++;
                    }
       }
        g<<nr<<'\n';

       p=1;u=1;x[1]=1;y[1]=1;
    b[1][1]=1;
      while (p<=u)
        {

           lc=y[p];
           cc=x[p];
            p++;
           for (i=1;i<=8;i++)
            {
                l=lc+dy[i];
                c=cc+dx[i];
                if (a[l][c]==0 && b[l][c]==0 && ok(l,c))
                {
                    u++;
                    b[l][c]=b[lc][cc]+1;
                    y[u]=l;
                    x[u]=c;
                }
            }
        }
          u=2*n-1;nr=0;
          yy[u]=n;xx[u]=n;
          while (xx[u]>1 || yy[u]>1)
          {
              if (b[yy[u]-1][xx[u]]==b[yy[u]][xx[u]] || b[yy[u]-1][xx[u]]==b[yy[u]][xx[u]]-1 && ok(l,c)){yy[u-1]=yy[u]-1;xx[u-1]=xx[u];}
              else {yy[u-1]=yy[u];xx[u-1]=xx[u]-1;}
              u--;nr++;
          }
           for(i=1;i<=nr+1 ;i++)g<<yy[i]<<" "<<xx[i]<<endl;

   f.close();
   g.close();
}