今天學習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;
}