POJ 1321 棋盘问题(DFS)

来源:互联网 发布:淘宝新用户有什么优惠 编辑:程序博客网 时间:2024/04/29 04:21

深搜,构思出解答树,基本不难...好久没写了,一开始写的没过,看着别人的解题报告启发。。。
#include<cstdio>#include<iostream>#include<cstring>using namespace std;int cnt;int main(){    void dfs(char chess[][10],int n,int k,int row,int key,bool flag[]);    int n,k,key;    char chess[10][10];    bool flag[10];    while(scanf("%d %d",&n,&k) && n != -1 && k != -1)    {        memset(flag,false,sizeof(flag));//列数的标记数组        cnt = 0,key = 0;        for(int i = 0 ; i < n ; i++)        {            getchar();            for(int j = 0 ; j < n ; j++)            {                cin>>chess[i][j];            }        }        dfs(chess,n,k,0,0,flag);        cout<<cnt<<endl;    }    return 0;}void dfs(char chess[][10],int n,int k,int row,int key,bool flag[]){    if(key == k)    {        cnt++;        return;    }    if(row > n)    {        return;    }    for(int j = 0 ; j < n ; j++)    {        if(chess[row][j] == '#' && !flag[j])        {            flag[j] = true;            dfs(chess,n,k,row+1,key+1,flag); //下一行中有符合条件的位置,row,key分别+1 继续搜索            flag[j] = false;        }    }    dfs(chess,n,k,row+1,key,flag);//下一行中没有符合要求的位置,只把row+1,key不变}//深搜,构造出解答树,根据解答树的特征来写出深搜



原创粉丝点击