http://poj.org/problem?id=1321
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> #include<queue> using namespace std; #define maxn 110000 #define INF 1e+7 int n,k,ans; char maps[20][20]; int v[20]; void DFS(int step,int x) { if(step == k+1) { ans++; return ; } if(x >= n) return ; for(int i=0; i<n; i++) { if(maps[x][i]=='#' && !v[i]) { v[i]=1; DFS(step+1,x+1); v[i]=0; } } DFS(step,x+1); } int main() { while(scanf("%d %d",&n, &k)) { if(n==-1 && k==-1) break; for(int i=0; i<n; i++) scanf("%s",maps[i]); memset(v,0,sizeof(v)); ans=0; DFS(1,0); printf("%d ",ans); } return 0; }