Input
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为-1 -1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
Output
Sample Input
2 1 #. .# 4 4 ...# ..#. .#.. #... -1 -1
Sample Output2
1
【思路】简单搜索
【注意】目前这一行可以不填继续dfs下一行,没列只能放一个用数组记录。
字符串输入还是从0开始。
【code】
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,k,ans,cnt; int lie[9]; char a[9][9]; void dfs(int x) { if(cnt==k){ ans++; return; } if(x>n)return; for(int i=0;i<n;i++){ if(a[x][i]=='#'&&!lie[i]){ lie[i]=1;cnt++; dfs(x+1); lie[i]=0;cnt--; } } dfs(x+1); } int main() { while(scanf("%d%d",&n,&k)) { if(n==-1&&k==-1)break; ans=0;cnt=0;memset(lie,0,sizeof(lie)); for(int i=0;i<n;i++) scanf("%s",a[i]); dfs(0); printf("%d\n",ans); } return 0; }