每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为-1 -1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
2 1 #. .# 4 4 ...# ..#. .#.. #... -1 -1
21
解题思路:这道题类似N皇后问题,不同的是棋盘不规则,但是解决方法一样,刚开始我用的是一维数组来解的,但是错误,因为这样有些地方考虑不到,所以用二维的办法。
解题代码:
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; char ch[10][10]; int vis[10]; int cnt; int n,m; void DFS(int k,int cur) { if(cur>=m) { cnt++; return; } for(int i=k;i<=n;i++) for(int j=1;j<=n;j++) { if(ch[i][j]=='#'&&vis[j]==0) { vis[j]=1; DFS(i+1,cur+1); vis[j]=0; } } return; } int main() { while(cin>>n>>m) { if(n==-1||m==-1) break; memset(ch,0,sizeof(ch)); for(int i=1;i<=n;i++) { getchar(); for(int j=1;j<=n;j++) scanf("%c",&ch[i][j]); } memset(vis,0,sizeof(vis)); cnt=0; DFS(1,0); printf("%d\n",cnt); } return 0; }