poj1321 基础DFS
最近两天在写搜索专题
题意:中文题就不用讲题意
思路:由于每行每列只允许最多一个棋子,那么我们可以从第一行开始往下搜索,并标记列,如果这列放了就不放,否则就放,并向下层搜索,这样可以不用标记行了。
#include<stdio.h> #include<string.h> int n,sum,m; const int maxn = 10; char map[maxn][maxn]; int visc[maxn]; void DFS(int r,int k) { if(k == m) { sum ++; return ; } if(r >= n)return ; for(int i =0;i<n;i++) { if(!visc[i] && map[r][i] == '#') { visc[i] = 1; DFS(r+1,k+1); visc[i] = 0; } } DFS(r+1,k); } int main() { while(scanf("%d%d",&n,&m),n+1+m+1) { sum = 0; memset(visc,0,sizeof(visc)); for(int i=0;i<n;i++) { scanf("%s",map[i]); } DFS(0,0); printf("%d\n",sum); } return 0; }