URAL-1627 Join

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
const int N=100+10;
const int dx[]={0,0,-1,1};
const int dy[]={-1,1,0,0};
const ll MOD=1e9;
ll b[N][N];
ll det(int n)
{
    ll ret=1;
    for(int i=0;i<n;i++)
    {
        for(int j=i+1;j<n;j++)
        {
            while(b[j][i])
            {
                ll t=b[i][i]/b[j][i];
                for(int k=i;k<n;k++)
                {
                    b[i][k]=(b[i][k]-t*b[j][k]%MOD+MOD)%MOD;
                    swap(b[i][k],b[j][k]);
                }
                ret=(-ret+MOD)%MOD;
            }
        }
        ret*=b[i][i];
        ret=(ret%MOD+MOD)%MOD;
    }
    return ret;
}
char g[15][15];
int id[15][15];
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=0;i<n;i++)
            scanf("%s",g[i]);
        memset(b,0,sizeof(b));
        int cnt=0;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            {
                if(g[i][j]=='*') continue;
                id[i][j]=cnt++;
            }
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            {
                if(g[i][j]=='*') continue;
                for(int k=0;k<4;k++)
                {
                    int ni=i+dx[k];
                    int nj=j+dy[k];
                    if(ni<0||ni>=n||nj<0||nj>=m) continue;
                    if(g[ni][nj]=='.')
                    {
                        b[id[i][j]][id[i][j]]++;
                        b[id[i][j]][id[ni][nj]]=-1;
                    }
                }
            }
        printf("%lld\n",det(cnt-1));
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/wl16wzl/article/details/83582939
今日推荐