标签:
Description
Input
Output
Sample Input
2 1 #. .# 4 4 ...# ..#. .#.. #... -1 -1
Sample Output
20 1
解题思路:只需从第一行第一个开始搜索,如果该位置该列没被标记且为棋盘,那么在这里放上棋子,并标记,
因为每行每列不能冲突,所以搜索下一行,比并且棋子数加1。每次搜索之前先要判断是否棋子已经用完,
如果用完,记录方案数加1,然后直接返回。
直到所有搜索全部完成,此时已得到全部方案数。
程序代码:
#include <cstdio> #include <cstring> using namespace std; char a[8][8]; int b[8];//列的访问状态 int c; int n,k; void dfs(int x,int num) { for(int j=0;j<n;j++) { if(a[x][j]==‘#‘ && b[j]==0) { if(num==1) c++; else { b[j]=1; for(int h=x+1;h<n-num+2;h++) dfs(h,num-1); b[j]=0; } } } } int main() { while(scanf("%d%d",&n,&k)==2 && !(n==-1 && k==-1)) { c=0; for(int i=0;i<n;i++) scanf("%s",a[i]); memset(b,0,sizeof(b)); for(int i=0;i<=n-k;i++) //一共要放k个棋子,每行至多一个,所以需要k行 { dfs(i,k); //从第i行开始,放k个棋子.按照按行递增的顺序访问,一定不会出现同行 } printf("%d\n",c); } return 0; }
标签:
原文地址:http://www.cnblogs.com/www-cnxcy-com/p/4690321.html