poj 1321
思路:有点枚举的意思 基本的分支限界
#include<iostream> #include<stdio.h> using namespace std; int a[11]; char map[11][11]; int n,k; int sum; void dfs(int t,int x)// 行号 需要放置的皇后数 { int i,j; if(x==0) { sum++; return ; } if(t>n) return ; dfs(t+1,x);//这一行不放棋子 for(i=1;i<=n;i++)//第t行的棋子放到第几列 { if(map[t][i]=='.')//不能放旗子 continue; for(j=1;j<=k-x;j++)//k-x 表示已经方的棋子 if(a[j]==i)//如果以前的第j颗棋子放到第i列 那么与当前的棋子发生冲突 不可行 break; if(j<=k-x)//已经发生冲突 continue; a[k-x+1]=i; dfs(t+1,x-1); } } int main() { int i,j; while(scanf("%d%d",&n,&k)!=EOF) { sum=0; if(n==-1&&k==-1) break; for(i=1;i<=n;i++) for(j=1;j<=n;j++) cin>>map[i][j]; dfs(1,k); cout<<sum<<endl; } return 0; }