题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4770
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
#include<list>
#define mem(x,y)memset(x,y,sizeof(x))
#define max(a,b)(a)>(b)?(a):(b)
#define min(a,b)(a)<(b)?(a):(b)
#define INF 0x1f1f1f1f
#define M 10000007
#define eps 1e-10
using namespace std;
typedef long long int LL;
typedef __int64 ll;
const int maxn=2005;
struct node
{
int x,y;
};
node q[maxn];
int f[maxn];
int vis[maxn][maxn];
int n,m,qnt,fnt,minn;
char a[maxn][maxn];
int fx1[3]= {0,-1,0};
int fy1[3]= {0,0,1};
int fx2[3]= {0,-1,0};
int fy2[3]= {0,0,-1};
int fx3[3]= {0,1,0};
int fy3[3]= {0,0,-1};
int fx4[3]= {0,1,0};
int fy4[3]= {0,0,1};
int check(node qq)
{
int i;
for(i=0; i<3; i++)
{
int xx=qq.x+fx1[i];
int yy=qq.y+fy1[i];
if(xx>=0&&xx<n&&yy>=0&&yy<m&&a[xx][yy]=='#')
{
return 0;
}
}
return 1;
}
void dfs(int id,int ii,int sum)
{
int i;
if(sum>=minn)return ;
if(ii==qnt)
{
minn=sum;
return ;
}
if(vis[q[ii].x][q[ii].y])
{
dfs(id,ii+1,sum);
}
if(f[ii]&&id!=ii)
{
int k;
int xxx,yyy;
for(k=0; k<3; k++)
{
xxx=q[ii].x+fx1[k];
yyy=q[ii].y+fy1[k];
if(xxx>=0&&xxx<n&&yyy>=0&&yyy<m&&a[xxx][yyy]!='#')
{
vis[xxx][yyy]=1;
}
}
dfs(id,ii+1,sum+1);
for(k=0; k<3; k++)
{
xxx=q[ii].x+fx1[k];
yyy=q[ii].y+fy1[k];
if(xxx>=0&&xxx<n&&yyy>=0&&yyy<m&&a[xxx][yyy]!='#')
{
vis[xxx][yyy]=0;
}
}
}
}
int main()
{
int i,j;
while(~scanf("%d %d",&n,&m))
{
if(n==0&&m==0)break;
qnt=0;
mem(vis,0);
mem(f,0);
for(i=0; i<n; i++)
{
scanf("%s",a[i]);
}
int ff=0;
for(i=n-1;i>=0;i--)
{
for(j=0;j<m;j++)
{
if(a[i][j]=='.')
{
q[qnt].x=i;
q[qnt].y=j;
qnt++;
ff=1;
}
}
}
if(!ff)
{
printf("0\n");
continue;
}
fnt=0;
for(i=0; i<qnt; i++)
{
f[i]=check(q[i]);
}
/*for(i=0;i<qnt;i++)
{
printf("%d ",f[i]);
}
printf("\n");*/
int k;
minn=INF;
for(i=0; i<qnt; i++)
{
for(j=0; j<4; j++)
{
int f;
int xx,yy;
if(j==0)
{
f=0;
for(k=0; k<3; k++)
{
xx=q[i].x+fx1[k];
yy=q[i].y+fy1[k];
if(xx>=0&&xx<n&&yy>=0&&yy<m&&a[xx][yy]=='#')
{
f=1;
break;
}
}
if(!f)
{
int xxx,yyy;
for(k=0; k<3; k++)
{
xxx=q[i].x+fx1[k];
yyy=q[i].y+fy1[k];
if(xxx>=0&&xxx<n&&yyy>=0&&yyy<m&&a[xxx][yyy]!='#')
{
vis[xxx][yyy]=1;
}
}
dfs(i,0,1);
for(k=0; k<3; k++)
{
xxx=q[i].x+fx1[k];
yyy=q[i].y+fy1[k];
if(xxx>=0&&xxx<n&&yyy>=0&&yyy<m&&a[xxx][yyy]!='#')
{
vis[xxx][yyy]=0;
}
}
}
}
else if(j==1)
{
f=0;
for(k=0; k<3; k++)
{
xx=q[i].x+fx2[k];
yy=q[i].y+fy2[k];
if(xx>=0&&xx<n&&yy>=0&&yy<m&&a[xx][yy]=='#')
{
f=1;
break;
}
}
if(!f)
{
int xxx,yyy;
for(k=0; k<3; k++)
{
xxx=q[i].x+fx2[k];
yyy=q[i].y+fy2[k];
if(xxx>=0&&xxx<n&&yyy>=0&&yyy<m&&a[xxx][yyy]!='#')
{
vis[xxx][yyy]=1;
}
}
dfs(i,0,1);
for(k=0; k<3; k++)
{
xxx=q[i].x+fx2[k];
yyy=q[i].y+fy2[k];
if(xxx>=0&&xxx<n&&yyy>=0&&yyy<m&&a[xxx][yyy]!='#')
{
vis[xxx][yyy]=0;
}
}
}
}
else if(j==2)
{
f=0;
for(k=0; k<3; k++)
{
xx=q[i].x+fx3[k];
yy=q[i].y+fy3[k];
if(xx>=0&&xx<n&&yy>=0&&yy<m&&a[xx][yy]=='#')
{
f=1;
break;
}
}
if(!f)
{
int xxx,yyy;
for(k=0; k<3; k++)
{
xxx=q[i].x+fx3[k];
yyy=q[i].y+fy3[k];
if(xxx>=0&&xxx<n&&yyy>=0&&yyy<m&&a[xxx][yyy]!='#')
{
vis[xxx][yyy]=1;
}
}
dfs(i,0,1);
for(k=0; k<3; k++)
{
xxx=q[i].x+fx3[k];
yyy=q[i].y+fy3[k];
if(xxx>=0&&xxx<n&&yyy>=0&&yyy<m&&a[xxx][yyy]!='#')
{
vis[xxx][yyy]=0;
}
}
}
}
else if(j==3)
{
f=0;
for(k=0; k<3; k++)
{
xx=q[i].x+fx4[k];
yy=q[i].y+fy4[k];
if(xx>=0&&xx<n&&yy>=0&&yy<m&&a[xx][yy]=='#')
{
f=1;
break;
}
}
if(!f)
{
int xxx,yyy;
for(k=0; k<3; k++)
{
xxx=q[i].x+fx4[k];
yyy=q[i].y+fy4[k];
if(xxx>=0&&xxx<n&&yyy>=0&&yyy<m&&a[xxx][yyy]!='#')
{
vis[xxx][yyy]=1;
}
}
dfs(i,0,1);
for(k=0; k<3; k++)
{
xxx=q[i].x+fx4[k];
yyy=q[i].y+fy4[k];
if(xxx>=0&&xxx<n&&yyy>=0&&yyy<m&&a[xxx][yyy]!='#')
{
vis[xxx][yyy]=0;
}
}
}
}
}
}
if(minn==INF)
{
printf("-1\n");
}
else
{
printf("%d\n",minn);
}
}
return 0;
}