题目链接:http://poj.org/problem?id=1321
题目解析:人都傻了,没看清题目就想开始做了。结果浪费了好多时间TAT
n表示的是棋盘的行数和列数,而用“.”表示棋盘空白的区域,而“#”表示棋盘区域,也就是棋子能摆放的位置,k表示要放的棋子数,因此总的来说,这个算是dfs里面的水题了、
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<cstdlib>
#include<string>
using namespace std;
int vis[12];
int ans=0,n,k;
char sou[9][9];
void dfs(int cur,int num){
if(num==k){
ans++;
return;
}
if(cur==n){
return;
}
for(int i=0;i<n;i++)
if(!vis[i]&&sou[cur][i]=='#'){
vis[i]=1;
dfs(cur+1,num+1);
vis[i]=0;
}
dfs(cur+1,num);//跳过该行
}
int main(){
while(cin>>n>>k){
if(n==-1&&k==-1)
break;
ans=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>sou[i][j];
memset(vis,0,sizeof(vis));
dfs(0,0);
cout<<ans<<endl;
}
return 0;
}