题目描述:
造房子.
题目分析:
根据条件连边,上矩阵树统计就好了
题目链接:
Ac 代码:
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <cstring>
#define ll long long
const int mod=1e9;
const int maxm=100;
int id[maxm][maxm],tot;
int dx[]={1,-1,0,0},dy[]={0,0,1,-1};
int n,m;
ll a[maxm][maxm];
inline ll Gauss()
{
ll ret=1;
for(int i=2;i<=tot;i++)
{
for(int j=i+1;j<=tot;j++)
while(a[j][i])
{
ll t=a[i][i]/a[j][i];
for(int k=i;k<=tot;k++) a[i][k]=(a[i][k]-a[j][k]*t)%mod;
for(int k=i;k<=tot;k++) std::swap(a[i][k],a[j][k]);
ret=-ret;
}
if(!a[i][i]) return 0;
ret=(ret*a[i][i])%mod;
}
return (ret%mod+mod)%mod;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
char s;
std::cin>>s;
if(s=='.') id[i][j]=++tot;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=0;k<4;k++)
{
int xx=i+dx[k],yy=j+dy[k];
if(!id[xx][yy]) continue;
a[id[xx][yy]][id[i][j]]--;
a[id[i][j]][id[i][j]]++;
}
printf("%lld\n",Gauss());
return 0;
}