标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 33731 | Accepted: 16720 |
Description
Input
Output
Sample Input
2 1 #. .# 4 4 ...# ..#. .#.. #... -1 -1
Sample Output
2 1
Source
/* 棋盘问题, 棋子摆放的位置只能是#, 且不能同行和同列. 由于我采用的是按行递增的顺序来搜索的, 因此不可能出现同行的情况, 对于同列的情况, 我设置了一个变量tag[], 来保存列的访问状态, 对于之前访问过的列, 棋子是不能再放在这一列上的. dfs(begin, num) 代表将第k-num棵棋子放在begin行上, 然后就剩下num-1棵棋子需要放在begin行下面. 当然, 可能存在第num棵棋子根本无法放在begin行上的情况, 对于这种情况, dfs就回溯到上一个dfs调用的地方, 重新开始, 而如果遇到num=1, 且第begin行的一些列可以放的话, 就将方案数相应增加. */ #include<cstdio> #include<iostream> using namespace std; #define N 8 char map[N][N]; int tag[N],ans,n,k; void dfs(int begin,int num){ for(int j=0;j<n;j++){ if(map[begin][j]==‘#‘&&!tag[j]){ if(num==1) ans++; else{ tag[j]=1; for(int h=begin+1;h<n-num+2;h++) dfs(h,num-1); tag[j]=0; } } } } int main(){ while(scanf("%d%d",&n,&k)==2&&n!=-1&&k!=-1){ ans=0; for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>map[i][j]; for(int i=0;i<n;i++) tag[i]=0; for(int i=0;i<=n-k;i++) dfs(i,k); printf("%d\n",ans); } return 0; }
标签:
原文地址:http://www.cnblogs.com/shenben/p/5573191.html