状压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;
}