http://poj.org/problem?id=1321
解题:
dfs中,两种情况,某一行摆不摆?某一列摆不摆?
#include<stdio.h> #include<iostream> #include<algorithm> #include<cstring> #include<math.h> #include<string> #include<map> #include<queue> #include<stack> #include<set> #define ll long long #define inf 0x3f3f3f3f using namespace std; char a[10][10]; int l[10];///列 int ans; int n,k; void dfs(int x,int cnt) { if(cnt==k)///摆k个,方案数+1 { ans++; return; } if(x==n)///行数越界 return; dfs(x+1,cnt);///这一行不摆 for(int j=0;j<n;j++)///遍历一行,有位置就摆! { if( a[x][j]=='#' && l[j]==0 && cnt<k )///如果有位置摆就摆,没有就不摆。 { l[j]=1; dfs( x+1,cnt+1 );///摆完就进入下一行,当前棋子数+1 l[j]=0;///这一列不摆 } } } int main() { while( scanf("%d%d",&n,&k) && n!=-1 && k!=-1 ) { memset(l,0,sizeof(l)); memset(a,0,sizeof(a)); ans=0; for(int i=0;i<n;i++) scanf("%s",a[i]); dfs(0,0);///行 棋子数 printf("%d ",ans); } return 0; }