双层dfs,小心点就过了,一星期没玩dfs,居然弄了我两个小时多。。。。。。这种智障
#include <stdio.h>
#include <string.h>
int h,w;
char str[51][52];
int ccnt[7],cnt,flag;
int mx[5]={0,1,-1,0,0},my[5]={0,0,0,1,-1};
void dfs2(int posy,int posx)
{
int i;
if(str[posy][posx]=='X')
{
str[posy][posx]='.';
for(i=1;i<5;i++)
{
posy+=my[i];posx+=mx[i];
if(posy<h&&posy>=0&&posx<w&&posx>=0)
dfs2(posy,posx);
posy-=my[i];posx-=mx[i];
}
}
}
void dfs1(int posy,int posx)
{
int i;
if(posy<0||posy>=h||posx<0||posx>=w) return;
if(str[posy][posx]=='.') return;
if(str[posy][posx]=='X')
{
if(flag) {cnt++;flag=0;ccnt[cnt]=0;}
ccnt[cnt]++;
dfs2(posy,posx);
for(i=1;i<5;i++)//注意这里
dfs1(posy+my[i],posx+mx[i]);
}
else{
str[posy][posx]='.';
for(i=1;i<5;i++)
dfs1(posy+my[i],posx+mx[i]);
}
}
int main(int argc, char const *argv[])
{
int i,j,t=0;
while(scanf("%d %d",&w,&h)&&w&&h)
{
printf("Throw %d\n",++t );
memset(str,0,sizeof(str));
for(i=0;i<h;i++)
scanf("%s",str[i]);
cnt=0;
memset(ccnt,0,7*sizeof(int));
for(i=0;i<h;i++)
{
for(j=0;j<w;j++)
{
flag=1;
if(str[i][j]!='.')
dfs1(i,j);
}
}
for(i=1;i<=cnt;i++)
for(j=1;j<=cnt-i;j++)
if(ccnt[j+1]<ccnt[j]) {ccnt[0]=ccnt[j];ccnt[j]=ccnt[j+1];ccnt[j+1]=ccnt[0];}
for(i=1;i<=cnt;i++)
printf("%d%c",ccnt[i],i!=cnt?' ':'\n' );
putchar('\n');
}
return 0;
}