此题思路:和九宫格思路差不多,出现不能放在一行或者一列或者对角线(x+y)||(n+x-y),用一维数组表示。
坑点:1.该行可以选与不选,像我就忘了不选该行,卡了很长时间。
2.不选的该行,放在选的情况外即for外,防止该行可以选多个点,每次不选该行都成立,结果重复多记。
3.递归出口的时候把total,放在大于n的前面,如果放在后面就会出现刚好等于n,满足了total等于k的情况,大于n放在前面会把这次成立的条件忽略不记。
4.读取字符注意%c的回车符,前面加个空格,注意dfs的参数,大于n从dfs(1)开始,等于n从dfs(0)开始。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <bitset>
#include <algorithm>
#include <climits>
using namespace std;
#define lson 2*i
#define rson 2*i+1
#define Pair pair<int, int>
#define ULL unsigned long long
#define LS l,mid,lson
#define RS mid+1,r,rson
#define up(i,x,y) for(int i=x;i<y;i++)
#define down(i,x,y) for(int i=x;i>=y;i--)
#define MEM(a,x) memset(a,x,sizeof(a))
#define W(a) while(a)
#define gcd(a,b) __gcd(a,b)
#define LL long long
#define N 1e5+5
#define MOD 1000000007
#define INF 0x3f3f3f3f
#define EXP 1e-8
#define lowbit(x) (x&-x)
#define _ ios_base::sync_with_stdio(0),cin.tie(0)
//freopen("1.txt", "r", stdin);
int a[30],b[30],c[30],d[30];
char maze[25][25];
int n,k,sum;
void dfs(int x,int total){//total为棋的个数 ,x为行,以行dfs
if(total==k){
sum++;
return;//这个注意这个if的位置
}
if(x>n){
return;
}
for(int i=1;i<=n;i++){//选该行,在行的基础上,检查列的位置是否符合条件
if(b[i]==0&&maze[x][i]=='#'){//满足条件进行下一步dfs
a[x]=i;//标记
b[i]=1;
dfs(x+1,total+1);//步数加一
a[x]=0;//取消标记
b[i]=0;
}
}
dfs(x+1,total); //不选该行
}
int main(){
while(~scanf("%d%d",&n,&k)&&(n!=-1)){
sum=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf(" %c",&maze[i][j]);
}
}
dfs(1,0);
printf("%d\n",sum);}
}