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);
        }
    }
  • 相关阅读:
    python中用exit退出程序
    习题5-2 使用函数求奇数和 (15分)
    习题5-1 符号函数 (10分)
    练习5-3 数字金字塔 (15分)
    练习5-2 找两个数中最大者 (10分)
    练习5-1 求m到n之和 (10分)
    ubuntu使用教程
    图解HTTP 上
    Sublime Text 3 插件
    两千行PHP学习笔记
  • 原文地址:https://www.cnblogs.com/RB26DETT/p/10763196.html
Copyright © 2011-2022 走看看