Pagini recente » Cod sursa (job #1489771) | Cod sursa (job #1668773) | Cod sursa (job #1066830) | Cod sursa (job #2304468) | Cod sursa (job #1732202)
#include <bits/stdc++.h>
#define infinit 1000000
using namespace std;
ifstream fin("insule.in");
ofstream fout("insule.out");
char a[105][105];
int b[105][105],n,m,cnt,v[105][105],c[105][105];
queue<pair<int,int> >st;
void Citire()
{
int i,j;
fin>>n>>m;
for(i=0;i<n;i++)
fin>>a[i];
}
inline void Formare()
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
v[i+1][j+1]=a[i][j]-'0';
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
b[i][j]=v[i][j];
}
void Initializare()
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
c[i][j]=infinit;
}
inline void Bordare()
{
int i;
for(i=0;i<=m+1;i++)
v[0][i]=v[n+1][i]=-1;
for(i=0;i<=n+1;i++)
v[i][0]=v[i][m+1]=-1;
}
inline void Fill(int i,int j,int k)
{
st.push(make_pair(i,j));
b[i][j]=0;
while(!st.empty())
{
i=st.front().first;
j=st.front().second;
st.pop();
if(b[i-1][j]==k)
{
b[i-1][j]=0;
st.push(make_pair(i-1,j));
}
if(b[i+1][j]==k)
{
b[i+1][j]=0;
st.push(make_pair(i+1,j));
}
if(b[i][j-1]==k)
{
b[i][j-1]=0;
st.push(make_pair(i,j-1));
}
if(b[i][j+1]==k)
{
b[i][j+1]=0;
st.push(make_pair(i,j+1));
}
}
}
inline void Cerinta1()
{
int nr1=0,nr2=0,nr3=0,i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
if(b[i][j]==1)
{
Fill(i,j,1);
nr1++;
}
else if(b[i][j]==2)
{
Fill(i,j,2);
nr2++;
}
else if(b[i][j]==3)
{
Fill(i,j,3);
nr3++;
}
}
fout<<nr1<<" "<<nr2<<" "<<nr3<<" ";
}
inline void Lee()
{
int i,j,x,y,k,minim=infinit;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
while(!st.empty())st.pop();
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(v[i][j]==0)
{
if(v[i][j-1]==1 || v[i][j+1]==1 || v[i-1][j]==1|| v[i+1][j]==1)
{
st.push(make_pair(i,j));
c[i][j]=1;
}
}
while(!st.empty())
{
i=st.front().first;
j=st.front().second;
st.pop();
for(k=0;k<4;k++)
{
x=i+dx[k];
y=j+dy[k];
if(v[x][y]==0 and c[x][y]>(c[i][j]+1))
{
c[x][y]=c[i][j]+1;
st.push(make_pair(x,y));
}
if(v[x][y]==2)
minim=min(minim,c[i][j]);
}
}
fout<<minim<<"\n";
}
int main()
{
Citire();
Formare();
Initializare();
Bordare();
Cerinta1();
Lee();
return 0;
}