zoukankan      html  css  js  c++  java
  • POJ-1321 棋盘问题 DFS

    题目链接:https://vjudge.net/problem/POJ-1321

    题意:

    这道题目意思是说在给定棋盘上摆放棋子(#位置才能放棋子),要求两棋子间不能同行或者同列,问有几种可能的摆放方式。

    分析:

    这道题是求解可行方案数,常用的方法有BFS和DFS,因为只有将所有棋子全部摆放完毕才能确定一种方案,故DFS较为适合。

    核心的实现思路是,用vis[]记录某一列是否被示用,用map[]记录期棋盘信息,每次从(0,0)开始搜索,按行搜索,判断某一位置是否可放,若可以则记录vis[此列]为1,并递归深度遍历dfs[现在所在行+1,列+1],当列位置>k时,说明棋子已全部成功摆放,则ans++。最后输出总的可能数ans。

    代码如下:

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #define inf 0x3fffffff
    const int maxn = 100;
    using namespace std;
    int map[maxn][maxn];
    bool vis[maxn];
    int n, k, ans = 0;
    
    void init() {
        memset(vis, false, sizeof(vis));
        ans = 0;
    }
    
    void dfs(int x, int y) {
        if(y >= k) {
            ans++;
            return;
        }
        for(int i = x; i < n; i++) {
            for(int j = 0; j < n; j++) {
                if(!vis[j] &&map[i][j] == 0) {
                    vis[j] = true;
                    dfs(i+1, y+1);
                    vis[j] = false;
                }
            }
        }
    }
    
    int main(void) {
        while(scanf("%d%d", &n, &k) == 2 && n != -1) {
            char c;
            init();
            for(int i = 0; i < n; i++) {
                for(int j = 0; j < n; j++) {
                     cin >> c;
                     if(c == '#') 
                         map[i][j] = 0;
                     else if(c == '.') 
                         map[i][j] = 1;
                 }
    //             getchar();
            }
            dfs(0, 0);
            printf("%d
    ", ans);
        }
    }
  • 相关阅读:
    类似qq弹窗,自动消失
    词法分析实验报告
    编译原理
    开发中遇到的杂七杂八
    Gradle+Jetty实现静态资源的热部署
    Eclipse中进行Gradle+Jetty部署的web项目的断点调试
    俳句与短歌收藏
    影评收藏
    诗歌与词曲收藏
    歌词收藏
  • 原文地址:https://www.cnblogs.com/RB26DETT/p/10763196.html
Copyright © 2011-2022 走看看