今天学习dfs,然后做到这道题,虽然不难,但一开始wa了一次。
题目大意:题目本身讲得很清楚了,这里不再赘述。附链接:http://poj.org/problem?id=1321。
大体思路:这道题从题意可以看出是属于深搜(dfs)的。开辟一个棋盘box[10][10],以及一个记录各列棋子情况的一维数组col[10],每一行棋子有两种情况,放与不放(关键)。一开始我每一行都循环,接着每一行都放,然后深搜完return再清空记录,接着放下一行,返回WA!!!因为我重复计算了某些情况,试了一组样例才发现。以下是正确代码:
#include<iostream>
#include<cstring>
using namespace std;
int col[10];
char box[10][10];
int num,n,k;
void solve(int cur,int cnt){
if(cnt==k){
num++;
return;
}
if(cur==n)
return;
solve(cur+1,cnt); //放棋子
//不放棋子
for(int i=0;i<n;i++){
if(col[i]==0&&box[cur][i]=='#'){
col[i]=1;
solve(cur+1,cnt+1);
col[i]=0;
}
}
}
int main(){
while(cin>>n>>k){
if(n==-1)
break;
memset(col,0,sizeof(col));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>box[i][j];
num=0;
solve(0,0);
cout<<num<<endl;
}
return 0;
}