这就是 n 皇后问题,不过简单了点,对于对角线不做限制
搜索,因为只有 8!个状态,直接数就可以了
状态压缩dp,每一行用一排1010代表上面有没有放过旗子,1是放过,0是没有,这一个行的状态可以是完全来自以前或者在这一行合法的地方放一个棋子。
每行有 2^n 种状态,共 n 行,每次转移要 n,总的就是 2^n*n*n;
两种代码
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
#define MAX 1000009
#define INF 0x3f3f3f3f
#define MS(x) memset(x,0,sizeof(x))
#define ll long long
#define P pair<int,int>
#define fst first
#define sec second
int ans;
char b[20][20];
int n;
void dfs(int r,int state,int k)
{
if(!k)
{
ans++;
return ;
}
if(r>=n)
return ;
dfs(r+1,state,k);
for(int i=0;i<n;i++)
{
if(((1<<i)&state)==0&&b[r][i]=='#')
{
dfs(r+1,(1<<i)|state,k-1);
}
}
}
int main()
{
int k;
while(scanf("