poj 1321 DFS

/*
题意:中文题,忽略

题解:DFS;因为k<=n,因此和普通的棋盘问题又有点不同,就是在搜索时要
注意某些行可能会没有点。
*/
#include <iostream>
#include <cstring>

using namespace std;

int n,k,ans;
int vis_cl[10];//记录列是否已存在点
char m[10][10];

void dfs(int r, int sum)//DFS,r为当前行,sum为当前搜索到的点的个数
{
    if (sum == k)//满足k个,结束搜索
    {
        ans++;
        return;
    }
    if (r >= n)//越界结束
        return ;
    for(int j=0; j<n; j++)
    {
        if ('#'==m[r][j] && !vis_cl[j])//有点就先搜索,后复原
        {
            vis_cl[j] = 1;
            dfs(r+1,sum+1);
            vis_cl[j] = 0;
        }
    }
    dfs(r+1,sum);//并不是所有行都有点,因此为了让DFS不在搜索完所有
                //解之前退出,这句的意思是当前行不加点,但是要继
                //续搜索下一行
}

int main(void)
{
    while (cin>>n>>k && n!=-1 && k!=-1)
    {
        for(int i=0; i<n; i++)
            cin>>m[i];
        ans = 0;
        memset(vis_cl,0,sizeof(vis_cl));
        dfs(0,0);
        cout<<ans<<endl;
    }
    return 0;
}

 

posted @ 2014-03-20 23:34  辛力啤  阅读(147)  评论(0编辑  收藏  举报