poj-1321(棋盤問題)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章