数据结构和算法分析传统数据结构和算法

poj1321(简单的dfs)

2018-01-21  本文已影响0人  42fighting

(最近在做kuangbin带你飞专题)问题链接:棋盘问题
这是一道入门dfs的题目,以为n的比较小,所以完全可以用dfs的方法通过这一道题。
我们先讨论一下这一道题目的思路,要求棋子的横竖均只能有一个棋子,我们可以对行进行dfs,用一个记录数组表示列是否已经含有棋子,既1表示有,0表示没有。dfs的过程中,填充棋子的数量等于k时,此dfs结束cnt++返回上一层,若遍历的行号等于n既已出范围直接结束此层dfs。若本行可填,注意回溯。
另外要注意k的大小会比n要小,dfs的情况需要注意。
ac代码如下:

#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
int k, n, cnt;
char s[10][10];
int col[10];
void dfs(int x, int num)
{
    if(num==k)
    {
        cnt++;
        return;
    }
    if(x==n)return;
    for(int i=0; i<n; i++)
        {
        if(s[x][i]=='#'&&!col[i])
        {
            col[i]=1;
            dfs(x+1, num+1);
            col[i]=0;
        }
    }
    if(x<n)
    dfs(x+1, num);
}

int main(void)
{
    while(scanf("%d%d", &n, &k))
    {
        cnt=0;
        memset(col, 0, sizeof(col));
        if(k==-1&&n==-1)
        break;
        for(int i=0; i<n; i++)
        scanf("%s", s[i]);
        dfs(0, 0);
        printf("%d\n", cnt);
    }
    return 0;
}

over

上一篇下一篇

猜你喜欢

热点阅读