1698: 海域, 冰山, 战舰
时间限制: 1 Sec 内存限制: 128 MB提交: 34 解决: 12
[ 提交][ 状态][ 讨论版]
题目描述
给出一个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皇后问题,在规定的图中求n个战舰的摆放方法的个数。
代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> using namespace std; char map[10][10]; int vis[11]; int n,m; int sum; void dfs(int a,int b) { if(b==m) sum++; else if(a==n) return ; else { for(int i=0;i<n;i++) { if(!vis[i]&&map[a][i]=='#') { vis[i]=1; dfs(a+1,b+1); vis[i]=0; } } dfs(a+1,b); } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { sum=0; memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) scanf("%s",map[i]); dfs(0,0); printf("%d\n",sum); } return 0; }