思路:这个题....暴力就好了...
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <cstdlib>
#include <ctime>
#define INF 0x3f3f3f3f
#define esp 1e-9
typedef long long LL;
using namespace std;
int n,m,dx[4]={-1,0,1,0},dy[4]={0,1,0,-1},x[20],y[20],ha[20],p;
char mp[220][220],vis[220][220];
void clear()
{
for(int j=0;j<p;j++) vis[x[j]][y[j]]=1;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int tt, ca=1;
while(scanf("%d%d",&n,&m)==2&&(n||m))
{
memset(mp[0],'.',sizeof(mp[0]));
for(int i=1;i<=n;i++)
{
scanf("%s",mp[i]+1);
mp[i][0]=mp[i][m+1]='.';
}
memset(mp[n+1],'.',sizeof(mp[0]));
int minp=INF;
p=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) if(mp[i][j]=='.')
{
x[p]=i;
y[p]=j;
p++;
}
//for(int i=0;i<p;i++) printf("%d %d\n",x[i],y[i]);
if(!p) { puts("0");continue; }
for(int i=0;i< 1<<p;i++)
{
int bit=0;
for(int j=0;j<p;j++) if(i&(1<<j)) bit++;
for(int j=0;j<p;j++) if(i&(1<<j))
{
for(int k=0;k<4;k++)
{
clear();
int c=0;
for(int l=0;l<p;l++) if(i&(1<<l))
{
if(l==j && mp[x[l]+dx[k]][y[l]+dy[k]]!='#' && mp[x[l]+dx[(k+1)%4]][y[l]+dy[(k+1)%4]]!='#')
{
c+=vis[x[l]][y[l]]+vis[x[l]+dx[k]][y[l]+dy[k]]+vis[x[l]+dx[(k+1)%4]][y[l]+dy[(k+1)%4]];
vis[x[l]][y[l]]=vis[x[l]+dx[k]][y[l]+dy[k]]=vis[x[l]+dx[(k+1)%4]][y[l]+dy[(k+1)%4]]=0;
}
else if(mp[x[l]-1][y[l]]!='#' && mp[x[l]][y[l]+1]!='#')
{
c+=vis[x[l]][y[l]]+vis[x[l]-1][y[l]]+vis[x[l]][y[l]+1];
vis[x[l]][y[l]]=vis[x[l]-1][y[l]]=vis[x[l]][y[l]+1]=0;
}
else
{
c=-1;
break;
}
}
if(c<p) continue;
minp=min(minp,bit);
goto abc;
}
}
abc:;
}
printf("%d\n",minp==INF?-1:minp);
}
return 0;
}