Cod sursa(job #2923964)

Utilizator RusuRRusu Rares RusuR Data 21 septembrie 2022 21:39:54
Problema Barbar Scor 80
Compilator cpp-32 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <fstream>

using namespace std;

ifstream f("barbar.in");
ofstream g("barbar.out");


int r,c,sx,sy,fx,fy,d[1001][1001],n;
char l;
bool p[1001][1001],ok;
int main()
{ f>>r>>c;
  for(int i=1;i<=r;i++)
     for(int j=1;j<=c;j++)
     { f>>l;
       switch(l){
       case 'I':
	sx=i;
        sy=j;
	break;
       case 'O':
	fx=i;
        fy=j;
	break;
       case 'D':
	d[i][j]=1;
	break;
       case '*':
	d[i][j]=-1;
        break;
       }
     }
  ok=1;
  n=1;
  while(ok)
  { ok=0;
    for(int i=1;i<=r;i++)
       for(int j=1;j<=c;j++)
       { if(d[i][j]>0&&d[i][j]==n)
         { if(d[i+1][j]==0)d[i+1][j]=d[i][j]+1,ok=1;
	   if(d[i][j+1]==0)d[i][j+1]=d[i][j]+1,ok=1;
	   if(d[i-1][j]==0)d[i-1][j]=d[i][j]+1,ok=1;
  	   if(d[i][j-1]==0)d[i][j-1]=d[i][j]+1,ok=1;
         }
       }
    n++;
    /*
   for(int i=1;i<=r;i++)
      { for(int j=1;j<=c;j++)cout<<d[i][j]<<' ';
        cout<<'\n';
      }
   cout<<'\n';*/
  }
  p[sx][sy]=1;
  ok=1;
  while(n>=2)
  { ok=0;
    for(int i=1;i<=r;i++)
       for(int j=1;j<=c;j++)
       { if(p[i][j]==1)
         { if(d[i+1][j]>=n&&p[i+1][j]==0)p[i+1][j]=1,ok=1;
	   if(d[i][j+1]>=n&&p[i][j+1]==0)p[i][j+1]=1,ok=1;
	   if(d[i-1][j]>=n&&p[i-1][j]==0)p[i-1][j]=1,ok=1;
  	   if(d[i][j-1]>=n&&p[i][j-1]==0)p[i][j-1]=1,ok=1;
         }
       }
    if(ok==0)n--;	
/*
    for(int i=1;i<=r;i++)
      { for(int j=1;j<=c;j++)cout<<p[i][j]<<' ';
        cout<<'\n';
      }

    cout<<'\n'<<n<<'\n';

   for(int i=1;i<=r;i++)
      { for(int j=1;j<=c;j++)cout<<d[i][j]<<' ';
        cout<<'\n';
      }
   cout<<'\n';
*/
    if(p[fx][fy]==1)
    { g<<n-1;
      return 0;	    
    }
  }
  g<<-1;
  return 0;
}