2016-08-10
题源:http://acm.hust.edu.cn/vjudge/contest/65959#overview
A - 棋盘问题
思路:要放k个棋子,dfs贪心深搜。
代码:
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; const int MAXN=10; int mmap[MAXN][MAXN]; //棋盘 bool vis[MAXN]; //标记数组 vis[1]=true表示1行已放棋子 int n,k; int ans; int sum; //记录已经放了多少个旗子 void dfs(int i) { if(sum==k) { ans++; return; } if(i>=n) return; for(int j=0;j<n;j++) { if(!vis[j]&&mmap[i][j]) { sum++; vis[j]=true; dfs(i+1); sum--; vis[j]=false; } } dfs(i+1); //第i行不放 } int main() { while(cin>>n>>k&&n!=-1&&k!=-1) { char temp; ans=0; sum=0; memset(mmap,0,sizeof(mmap)); memset(vis,false,sizeof(vis)); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { cin>>temp; if(temp=='#') mmap[i][j]=1; } } dfs(0); cout<<ans<<endl; } return 0; }