参考n皇后问题, 枚举棋盘的每一个位置, 每个位置有两种情况,1.不放棋子,那就递归到下个位置dfs(x ,y + 1 , t).
2.如果放棋子,则需要满足情况,所在的行和列没有放过,即row[x],col[y] 为false
#include <iostream>
#include<stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
#include <math.h>
#include <queue>
#include <stack>
using namespace std;
const int N = 8 + 10;
char g[N][N];
bool row[N],col[N];
int n,m;
int cnt;
void dfs(int x,int y,int t) //x坐标,y坐标,t 已放棋子数
{
if(x >= n) return; //越界退出
if(t == m)
{
cnt ++;
return;
}
if(y == n) y = 0, x++;
dfs(x,y + 1,t); //不放
if(!row[x] && !col[y] && g[x][y] == '#') //放
{
row[x] = col[y] = true;
dfs(x ,y + 1,t + 1);
row[x] = col[y] = false;
}
}
int main()
{
while(cin >> n >> m)
{
cnt = 0;
if(n == -1 && m == -1)
break;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
cin >> g[i][j];
dfs(0,0,0);
cout << cnt << endl;
}
return 0;
}
终于找到一篇状态设计一样的题解了。