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);
        }
    }
  • 相关阅读:
    [译] 如何用ps制作火焰字
    Sublimetext gitHub 问题收集
    微博置顶
    迅雷评分效果
    phpstorm 3.0.3 git bug
    javascript,jQuery书籍
    dom 的添加或事件绑定
    ext源码阅读 DomHelper createHtml,insertHtml
    用于WebKit的CSS诀窍图片版
    二级下拉菜单
  • 原文地址:https://www.cnblogs.com/RB26DETT/p/10763196.html
Copyright © 2011-2022 走看看