
题意:
给你一个棋盘,问在这个棋盘上放K个棋子,有多少种放法(每行每列只能有一个棋子)
题解:
对棋盘DFS搜索,每满足一种就ans++,基本是裸的
AC代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
#include<string.h> typedef long long ll; const int maxn=17; char mp[maxn][maxn]; bool vis[maxn]; ll ans=0; int k,n; void (int x,int y){ if(y>=k){ ans++; return ; } for(int i=x;i<n;i++){ for(int j=0;j<n;j++){ if(vis[j]==0&&mp[i][j]=='#'){ vis[j]=1; dfs(i+1,y+1); vis[j]=0; } } } return; } int main(){ while(scanf("%d%d",&n,&k)){ if(n==-1&&k==-1)break; memset(mp,0,sizeof(mp)); memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++)scanf("%s",mp[i]); ans=0; dfs(0,0); printf("%lldn",ans); } return 0; }
|
近期评论