码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 1321 棋盘问题 --- DFS

时间:2015-12-05 00:20:10      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:

POJ 1321 棋盘问题  http://poj.org/problem?id=1321

技术分享
/*POJ 1321 棋盘问题 --- DFS*/
#include <cstdio>
#include <cstring>

int n, k, cnt;
bool visit[10]; //标记列的访问状态
char mapp[10][10];

/*从第r行开始正确放置p个棋子*/
void dfs(int r, int p){
    if (p == 0){
        ++cnt;
        return;
    }
    if (r >= n || n-r < p) //剪枝 --> n-r >= p才能成功放置
        return;
    for (int j = 0; j < n; ++j){
        if (mapp[r][j] == # && !visit[j]){
            visit[j] = 1; //在r行j列放一枚棋子
            dfs(r + 1, p - 1);
            visit[j] = 0;
        }
    }
    dfs(r + 1, p); //由于棋子数小于行数, 可以第r行不放棋子,从下一行开始
}

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

    return 0;
}
View Code

 

POJ 1321 棋盘问题 --- DFS

标签:

原文地址:http://www.cnblogs.com/tommychok/p/5020850.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!