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\n", ans);
    }
}
posted @ 2019-04-24 16:37  boobo  阅读(188)  评论(0编辑  收藏  举报
^