比赛 2024暑假C班集训A 评测结果 AAAAAAAAAT
题目名称 牧场的安排 最终得分 90
用户昵称 123 运行时间 2.415 s
代码语言 C++ 内存使用 3.50 MiB
提交时间 2024-07-10 11:32:48
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=110,Mod=100000000;
struct node {
    int x,y;
} a[N*N];
int n,m,tot=0,cnt=0,idx[N],head[N],nxt[N],flag[N][N];
long long ans=0;
void add(int x,int y)
{
    idx[++cnt]=y;
    nxt[cnt]=head[x];
    head[x]=cnt;
}
int check(int step)
{
    for (int i=head[step];i;i=nxt[i])
    {
        int q=idx[i];
        if (flag[a[q].x][a[q].y])
        {
            return 0;
        }
    }
    return 1;
}
void dfs(int step)
{
    if (step==tot+1)
    {
        ans++;
        ans%=Mod;
        return ;
    }
    dfs(step+1);
    if (check(step))
    {
        flag[a[step].x][a[step].y]=1;
        dfs(step+1);
        flag[a[step].x][a[step].y]=0;
    }
}
int main() {
    freopen("cowfood.in","r",stdin);
    freopen("cowfood.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
    {
        for (int j=1;j<=m;j++)
        {
            int x;
            scanf("%d",&x);
            if (x)
            {
                a[++tot].x=i;
                a[tot].y=j;
            }
        } 
    }
    for (int i=1;i<=tot-1;i++)
    { 
        for (int j=i+1;j<=tot;j++)
        {
            int l=abs(a[i].x-a[j].x),r=abs(a[i].y-a[j].y);
            if (l==0 && r==1 || l==1 && r==0)
            {
                add(i,j);
                add(j,i);
            }
        }
    }
    dfs(1);
    printf("%lld",ans);
}