首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

POJ 1321 棋盤問題:DFS 搜索解法

     編輯:關於C++

題目大意

在一個 n×n 的不規則棋盤上(# 為可放區域,. 為空白),放置 k 個無差別棋子,要求任意兩子不同行、不同列。求擺放方案數 C(n ≤ 8, k ≤ n)。

解題思路

按行遞歸搜索:對於當前行,嘗試在每個 # 且列未被佔用的位置放置棋子,標記該列,遞歸處理下一行;也可選擇不在本行放置。這樣天然保證不同行,列用 vis[] 陣列去重。時間複雜度可接受。

參考代碼 (C++)

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;

int n, k, ans;
char mp[10][10];
bool vis[10];

void dfs(int cur, int cnt) {
    if (cnt == k) { ans++; return; }
    if (cur > n) return;
    for (int i = cur; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if (mp[i][j] == '#' && !vis[j]) {
                vis[j] = true;
                dfs(i + 1, cnt + 1);
                vis[j] = false;
            }
        }
    }
}

int main() {
    while (scanf("%d%d", &n, &k) != EOF && n != -1 && k != -1) {
        memset(vis, 0, sizeof(vis));
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++)
                scanf(" %c", &mp[i][j]);
        ans = 0;
        dfs(1, 0);
        printf("%d\n", ans);
    }
    return 0;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved