• POJ 1321 棋盘问题 --- DFS


      POJ 1321

      题目大意:给定一棋盘,在其棋盘区域放置棋子,需保证每行每列都只有一颗棋子。 (注意 .不可放 #可放)

      解题思路:利用DFS,从第一行开始依次往下遍历,列是否已经放置棋子用一个数组标记,直至放完要求的棋子数。

    /*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
    ", cnt);
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    cf1131f 构造+并查集
    多源最短路小结
    bzoj2200拓扑排序+最短路+联通块
    cf478d 线性dp好题
    cf919D 线性dp+拓扑排序
    hiho1460 rmq模板题
    最小标示法模板 poj1509
    JAVA动态代理机制分析guide
    java动态代理(JDK和cglib)
    AOP面向切面编程
  • 原文地址:https://www.cnblogs.com/tommychok/p/5020850.html
Copyright © 2020-2023  润新知