2、总结:
题意:给定棋盘上放k个棋子,要求同行同列都不重。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstring> #include<cmath> #include<queue> #include<algorithm> #include<cstdio> #define max(a,b) a>b?a:b #define F(i,a,b) for (int i=a;i<=b;i++) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define LL long long using namespace std; const int N=10010,MAX=1000100; int n,k,sum; int col[15]; char mapn[15][15]; void dfs(int cow,int kk) { F(i,1,n){ if(mapn[cow][i]=='#'&&!col[i]){ if(kk==1)sum++; else { col[i]=1; F(begin,cow+1,n-kk+2){ //即从begin这行开始到n-kk+2行都作为本次dfs的起始行,这样才可保证不遗漏不重复 dfs(begin,kk-1); } col[i]=0; } } } return ; } int main() { while(~scanf("%d%d",&n,&k)) { if(n==-1&&k==-1)break; F(i,1,n)F(j,1,n) cin>>mapn[i][j]; mes(col,0); sum=0; F(i,1,n-k+1){ //依次搜第1到n-k+1行,即第1个棋子在第1到n-k+1行里选 dfs(i,k); } cout<<sum<<endl; } return 0; }