Pagini recente » Cod sursa (job #1644938) | Cod sursa (job #156841) | Cod sursa (job #1416207) | Cod sursa (job #2310381) | Cod sursa (job #1183368)
#include <fstream>
#include <iostream>
using namespace std;
ifstream f("insule.in");
ofstream g("insule.out");
struct {int x,y;}c[100003],v,d;
const int dl[]={-1,0,1,0},dc[]={0,1,0,-1};
long int n,m,a[110][110],i,j,b[103][103],nr,nb,ng,minim=32000,mx;
char cho;
void read()
{
f>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
f>>cho;a[i][j]=cho-'0';
if(a[i][j]==2) a[i][j]=20000;
b[i][j]=a[i][j];
}
}
void bordare()
{
for(i=0;i<=n+1;i++)
a[i][0]=-1,a[i][m+1]=-1;
for(i=0;i<=m+1;i++)
a[0][i]=-1,a[n+1][i]=-1;
}
void flood(int j,int l)
{
int inc,sf,i,k=b[j][l];
b[j][l]=0;
inc=sf=1;
c[1].x=j;c[1].y=l;
while(inc<=sf)
{
v=c[inc++];b[v.x][v.y]=0;
for(i=0;i<4;i++)
{
d.x=v.x+dl[i];
d.y=v.y+dc[i];
if(b[d.x][d.y]==k)
{
c[++sf]=d;
b[d.x][d.y]=0;
}
}
}
if(k==1) nr++;
else if(k==20000) ng++;
else if(k==3) nb++;
}
void lee(int j,int l)
{
int inc,sf,i,k=0,gasit=0;
inc=sf=1;
c[1].x=j;c[1].y=l;
while(inc<=sf && !gasit)
{
v=c[inc];
for(i=0;i<4;i++)
{
d.x=v.x+dl[i];
d.y=v.y+dc[i];
if(a[d.x][d.y]==20000)
gasit=1,k=a[c[inc].x][c[inc].y];
if(a[d.x][d.y]==0)
{
a[d.x][d.y]=a[v.x][v.y]+1;
c[++sf]=d;
}
}
inc++;
}
k--;
if(k>0 && k<minim)
minim=k;
a[c[1].x][c[1].y]=1;
for(i=2;i<=sf;i++)
a[c[i].x][c[i].y]=0;
}
int main()
{
read();
bordare();
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{if(b[i][j]) flood(i,j);
if(a[i][j]==1) lee(i,j);}
g<<nr<<" "<<ng<<" "<<nb<<" "<<minim;
f.close();g.close();
return 0;
}