状压dfs

#include <bits/stdc++.h>
#define int long long
#define MAXN (int)(20)
using namespace std;
char a[MAXN][MAXN];
int n;
int cth[MAXN], ctl[MAXN];
int all;
int ans;
int lowbit(int x)
{
    return x & -x;
}
void dfs(int lines,int zuodui,int youdui,int u)
{
    if (u == n)
    {
        ans++;
        return;
    }
    int zhuangtai = (all&(~(lines | zuodui | youdui|cth[u])));
    for (int i = zhuangtai; i; i -= lowbit(i))
    {
        int x=lowbit(i);
        dfs(lines+x,zuodui+x >> 1, youdui+x << 1, u + 1);
    }
}
signed main()
{
    cin >> n;
    all = (1 << n) - 1;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cin >> a[i][j];
            cth[i] += ((a[i][j] == '.' ? 1 : 0) << j);
        }
    }
    dfs(0,0,0,0);
    cout<<ans;
    return EXIT_SUCCESS;
}