[HEOI2015]小Z的房间
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=15,maxm=225,mod=1e9;
int n,m;
int mm[maxn][maxn],e[maxn][maxn];
ll a[maxm][maxm];
char s[20];
int dx[]= {0,0,1,-1};
int dy[]= {1,-1,0,0};
ll gauss(ll a[][maxm],int n)
{
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j)
a[i][j]=(a[i][j]+mod)%mod;
ll ans=1;
for(int j=1; j<=n; ++j)
{
for(int i=j+1; i<=n; ++i)
{
while(a[i][j])
{
ll t=a[j][j]/a[i][j];
for(int k=j; k<=n; ++k)
{
a[j][k]=(a[j][k]-t*a[i][k]%mod+mod)%mod;
swap(a[i][k],a[j][k]);
}
ans*=-1;
}
}
ans=ans*a[j][j]%mod;
}
return (ans+mod)%mod;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1; i<=n; ++i)
{
scanf("%s",s+1);
for(int j=1; j<=m; ++j)
mm[i][j]=(s[j]=='.');
}
int cnt=0;
for(int i=1; i<=n; ++i)
for(int j=1; j<=m; ++j)
if(mm[i][j]) e[i][j]=++cnt;
for(int i=1; i<=n; ++i)
{
for(int j=1; j<=m; ++j)
{
for(int k=0; k<=3; ++k)
{
int ni=i+dx[k],nj=j+dy[k];
if(mm[i][j]&&mm[ni][nj])
{
a[e[i][j]][e[i][j]]++;
a[e[i][j]][e[ni][nj]]--;
}
}
}
}
printf("%lld\n",gauss(a,cnt-1));
return 0;
}