Sunteți pe pagina 1din 2

#include <fstream>

using namespace std;


#define MAX 1000000
#define M 1005
#define N 1005
long long n,m,i,j,k,l,q1=1,ct[M][N];
bool stop;
ifstream f("euler.in");
ofstream g("euler.out");
struct vector
{
int st,dr;
} q[MAX];
void citire()
{
f>>m>>n;
for (i=1;i<=m;i++)
for (j=1;j<=n;j++)
{
f>>ct[i][j];
if (ct[i][j]==-1)
{
q[0].st=i;
q[0].dr=j;
}
}
}
inline void dreapta()
{
q[q1].st=i;
q[q1].dr=j+1;
ct[i][j+1]=k+1;
q1++;
if (j+1==n) stop=1;
}
inline void stanga()
{
q[q1].st=i;
q[q1].dr=j-1;
ct[i][j-1]=k+1;
q1++;
if (j-1==1) stop=1;
}
inline void sus()
{
q[q1].st=i-1;
q[q1].dr=j;
ct[i-1][j]=k+1;
q1++;
if (i-1==1) stop=1;
}
inline void jos()
{
q[q1].st=i+1;
q[q1].dr=j;
ct[i+1][j]=k+1;
q1++;
if (i+1==m) stop=1;

}
inline void verf()
{
if ((ct[i][j+1]==0) && !(j==n))
dreapta();
if ((ct[i][j-1]==0) && !(j==1))
stanga();
if ((ct[i-1][j]==0) && !(i==1))
sus();
if ((ct[i+1][j]==0) && !(i==m))
jos();
}
void solve()
{
for (l=0;!stop;l++)
{
i=q[l].st;
j=q[l].dr;
if ((i==0)&&(j==0)) {stop=1;k=-1;}
else {verf();
if (!((ct[q[l].st][q[l].dr]==ct[q[l+1].st][q[l+1].dr])|| (ct[q[l].st][q[
l].dr]==ct[q[l+2].st][q[l+2].dr])
|| (ct[q[l].st][q[l].dr]==ct[q[l+3].st][q[l+3].dr]) || (ct[q[l].
st][q[l].dr]==ct[q[l+4].st][q[l+4].dr]))|| (stop))
k++;}
}
}
void scriere()
{
g<<k<<"\n";
}
int main()
{
citire();
solve();
scriere();
return 0;
}

S-ar putea să vă placă și