1698: 海域, 冰山, 战舰
时间限制: 1 Sec 内存限制: 128 MB提交: 17 解决: 5
[ 提交][ 状态][ 讨论版]
题目描述
给出一个n * n的海洋,#代表海域,.代表冰山,要在海域中放置k个战舰,战舰会攻击同一行同一列的其他战舰,所以同一行同一列不能放置其他战舰,问摆放战舰的方案数目C有多少种(数据保证C<2^31)。
输入
输入含有多组测试数据。
每组数据的第一行是两个正整数,n k,(n <= 8, k <= n)
随后的n行描述了的海洋的形状:每行有n个字符,其中 # 表示海域, . 表示冰山
输出
对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。
样例输入
2 1 #. .# 4 4 ...# ..#. .#.. #...
样例输出
2
1
类似于N皇后问题~
AC-code:
#include<cstdio> #include<cstring> int k,m,sum,vis[10]; char s[10][10]; void dfs(int row,int num) { if(num==k) sum++; else if(row==m) return ; else { for(int i=0;i<m;i++) { if(!vis[i]&&s[row][i]=='#') { vis[i]=1; dfs(row+1,num+1); vis[i]=0; } } dfs(row+1,num); } } int main() { int i; while(~scanf("%d%d",&m,&k)) { for(i=0;i<m;i++) scanf("%s",s[i]); memset(vis,0,sizeof(vis)); sum=0; dfs(0,0); printf("%d\n",sum); } return 0; }