1114棋盤問題acwing(深度優先搜索)

題目描述

在一個給定形狀的棋盤(形狀可能是不規則的)上面擺放棋子,棋子沒有區別。

要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請編程求解對于給定形狀和大小的棋盤,擺放 kk 個棋子的所有可行的擺放方案數目 CC。

輸入格式

輸入含有多組測試數據。

每組數據的第一行是兩個正整數 n,kn,k,用一個空格隔開,表示了將在一個 n?nn?n 的矩陣內描述棋盤,以及擺放棋子的數目。當為-1 -1時表示輸入結束。

隨后的 nn 行描述了棋盤的形狀:每行有 nn 個字符,其中 # 表示棋盤區域, . 表示空白區域(數據保證不出現多余的空白行或者空白列)。

輸出格式

對于每一組數據,給出一行輸出,輸出擺放的方案數目 CC (數據保證 C<231C<231)。

數據范圍

n≤8,k≤nn≤8,k≤n

輸入樣例:
2 1
#.
.#
4 4
...#
..#.
.#..
#...
-1 -1
輸出樣例:
2
1

代碼如下:

#include <bits/stdc++.h>
using namespace std;// 全局變量聲明
int res = 0;            // 結果,存儲可行方案數目
int nn = 0, number = 0; // nn為棋盤大小n,number為需要放置的棋子數k
vector<bool> v;         // 標記列是否被占用,v[i]為true表示第i列已被使用
vector<vector<char>> b; // 棋盤,存儲'#'和'.',b[x][i]表示第x行第i列// 深度優先搜索函數
// 參數x:當前處理的行號,count:已放置的棋子數目
void dfs(int x, int count) {// 如果已放置number個棋子,方案數+1并返回if (count == number) {res++;return;}// 若超出棋盤行數,直接返回if (x > nn) {return;}// 遍歷當前行的所有列,嘗試放置棋子for (int i = 1; i <= nn; i++) {// 如果當前列未被占用且該位置可放置if (!v[i] && b[x][i] == '#') {v[i] = true;           // 標記該列為已使用dfs(x + 1, count + 1); // 遞歸處理下一行,棋子數+1v[i] = false;          // 回溯,撤銷列的標記}}// 不放置當前行的棋子,直接處理下一行dfs(x + 1, count);
}int main() {// 循環處理多組輸入,直到輸入-1 -1為止while (1) {cin >> nn >> number;if (nn == -1 && number == -1)break;// 初始化棋盤和標記數組b.assign(nn + 1, vector<char>(nn + 1, 0));v.assign(nn + 1, false);// 讀取棋盤數據,注意行和列從1開始存儲for (int i = 1; i <= nn; i++) {for (int j = 1; j <= nn; j++) {cin >> b[i][j];}}res = 0;            // 重置結果dfs(1, 0);           // 從第1行開始搜索,初始已放置0個棋子cout << res << endl; // 輸出當前棋盤的方案數}return 0;
}/*
思路詳解:
1. **問題分析**:在n×n棋盤的'#'位置放置k個棋子,要求任意兩個棋子不同行不同列。需要計算所有可行方案數。
2. **搜索策略**:采用深度優先搜索(DFS)逐行處理,每行有兩種選擇:放置或不放置棋子。
3. **放置規則**:- 在當前行選擇一個未被占用的列(對應'#'位置)。- 標記該列,遞歸處理下一行。- 回溯時撤銷列的標記,以嘗試其他可能的列。
4. **剪枝與終止條件**:- 當已放置k個棋子時,方案數+1。- 當處理完所有行時終止當前路徑。
5. **復雜度優化**:逐行處理避免行沖突,列標記數組避免列沖突,確保每行每列最多一個棋子。
6. **遞歸過程**:每次遞歸處理下一行,確保行號遞增,從而覆蓋所有行選擇組合。
*/

代碼說明

  1. DFS 遞歸搜索
    • 遍歷當前行 x 的所有列,如果當前格子是 # 且該列未被占用,就放置棋子,并遞歸搜索下一行。
    • 不放置棋子,直接跳到下一行,保證搜索完整棋盤。
  2. 回溯
    • 遞歸調用 dfs(x+1, count+1); 進入下一行。
    • 遞歸返回后,取消該列的占用狀態v[i] = false;),以便嘗試其他方案。
  3. 終止條件
    • 棋子數量等于 k:找到一種有效方案,res++ 并返回。
    • 超出行界限 x > n:無效路徑,直接返回。

時間復雜度分析

最壞情況下,n=8k=8,即 8! ≈ 40,320,這種規模可以接受。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896718.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896718.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896718.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

logback日志輸出配置范例

logback日志輸出配置范例 在wutool中&#xff0c;提供了logback日志輸出配置范例&#xff0c;實現日志文件大小限制、滾動覆蓋策略、定時清理等功能。 關于wutool wutool是一個java代碼片段收集庫&#xff0c;針對特定場景提供輕量解決方案&#xff0c;只要按需選擇代碼片段…

測試人員如何驅動開發?

軟件開發中測試人員的作用正在從傳統的缺陷發現者演變為開發過程的主動推動者。特別是在敏捷和 DevSecOps 環境中&#xff0c;測試人員如何通過參與需求、提供反饋和推動自動化來驅動開發&#xff0c;成為一個值得探討的話題。本文將詳細分析測試人員驅動開發的具體方式&#x…

大模型語料庫的構建過程 包括知識圖譜構建 垂直知識圖譜構建 輸入到sql構建 輸入到cypher構建 通過智能體管理數據生產組件

以下是大模型語料庫的構建過程&#xff1a; 一、文檔切分語料庫構建 數據來源確定&#xff1a; 首先&#xff0c;需要確定語料庫的數據來源。這些來源可以是多種多樣的&#xff0c;包括但不限于&#xff1a; 網絡資源&#xff1a;利用網絡爬蟲技術從各種網站&#xff08;如新聞…

oracle游標為什么沒有共享,統計一下原因

-- Script Code為什么沒共享 define sql_id bs391f0yq5tpw;set serveroutput onDECLAREv_count number;v_sql varchar2(500);v_sql_id varchar2(30) : &sql_id; BEGINv_sql_id : lower(v_sql_id);dbms_output.put_line(chr(13)||chr(10));dbms_output.put_line(sql_id: ||…

哈希碰撞攻防戰——深入淺出Map/Set的底層實現

各位看官早安午安晚安呀 如果您覺得這篇文章對您有幫助的話 歡迎您一鍵三連&#xff0c;小編盡全力做到更好 歡迎您分享給更多人哦 今天我們來學習Map/Set的底層實現 目錄 問題一&#xff1a;hash會出現負數&#xff1f;數組越界 一&#xff1a;什么是二叉搜索樹&#xff1f…

win10使用haneWIN NFS Server掛載NFS v2服務,u-boot通過NFS下載zImage

1. haneWIN NFS Server掛載NFS v2服務 https://www.hanewin.net/nfs-e.htm netstat -ano | findstr ":2049"TCP 0.0.0.0:2049 0.0.0.0:0 LISTENING 3824UDP 0.0.0.0:2049 *:* 38…

Linux文件系統與目錄結構

Linux系統中一切皆文件 bin 是Binary 的縮寫, 這個目錄存放著最經常使用的命令 boot 這里存放的是啟動Linux時使用的一些核心文件&#xff0c;包括一些連接文件以及鏡像文件&#xff0c;自 己的安裝別放這里。 cdrom 這個目錄通常專門用來掛載光盤。當系統剛安裝時&#x…

一文詳解基于NarrotoAI的短劇短視頻自動解說、混剪AI平臺搭建

背景 前陣給孩子做電子相冊學了點剪輯技術&#xff0c;就想湊個熱鬧剪剪短劇玩玩&#xff0c;一是學以 致用&#xff0c;再者也好奇短劇創作為啥這么火&#xff0c;跟個風。 初步了解情況后&#xff0c;發現我的剪輯技術已經落后了&#xff0c;行家們玩的主要是解說 &#xf…

計算機畢業設計Hadoop+Spark+DeepSeek-R1大模型音樂推薦系統 音樂數據分析 音樂可視化 音樂爬蟲 知識圖譜 大數據畢業設計

溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 作者簡介&#xff1a;Java領…

《Canvas修仙傳·第三重天金丹境(下集)》 ——量子煙花與物理宇宙的混沌法則

各位道友久候&#xff01;上集我們煉就了《靈蛇奇譚》的元神&#xff0c;今日將開啟Canvas修仙路上最絢麗的篇章——掌控微觀粒子的創世之力&#xff01;(&#xff89;≧?≦)&#xff89; 章前黑話詞典 &#x1f50d; 量子境術語表&#xff1a; 對象池&#xff08;Object Po…

c++ namespace名字域空間

在C中&#xff0c;namespace 是一個非常重要的概念&#xff0c;用于組織代碼&#xff0c;避免名稱沖突。namespace&#xff08;命名空間&#xff09;是一個邏輯上的代碼組織單元&#xff0c;用于將代碼&#xff08;類、函數、變量等&#xff09;分組&#xff0c;從而避免命名沖…

獲取阿里云OSS預簽名URL下載(java)

1,引入依賴 <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId> </dependency> <!--AliSms--> <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-s…

中間件專欄之Redis篇——Redis的基本IO網絡模型

Redis主要采用的是單線程的事件驅動模型&#xff0c;通過I/O多路復用來實現高效的并發請求處理。 一、單線程模型 Redis 采用 單線程模型 來處理所有請求&#xff0c;包括網絡 I/O 和命令執行。雖然現代多核 CPU 能夠并行處理任務&#xff0c;但 Redis 的設計原則是盡量避免多…

Python 線程同步

Python 線程同步 Python 線程同步 Python 線程同步 線程同步是一種確保兩個或多個線程不同時執行同一塊共享代碼的機制。共享塊中的代碼通常是訪問共享數據或資源&#xff0c;這種共享塊被稱作臨界區。這個概念可以用下面的圖清晰地表示出來&#xff1a; #mermaid-svg-2TivIuc…

Linux操作系統5-進程信號3(信號的捕捉流程,信號集,sigaction)

上篇文章&#xff1a;Linux操作系統5-進程信號3&#xff08;信號的保存, 用戶態與內核態&#xff0c;內核空間&#xff09;-CSDN博客 本篇Gitee倉庫&#xff1a;???????myLerningCode/l26 橘子真甜/Linux操作系統與網絡編程學習 - 碼云 - 開源中國 (gitee.com) 本篇重點…

【機器學習chp10】降維——(核化)PCA + MDS + lsomap + 拉普拉斯特征映射 + t-NSE + UMAP

目錄 一、降維的意義與本質 1、意義 2、本質 3、常見降維方法 &#xff08;1&#xff09;線性降維 &#xff08;2&#xff09;非線性降維 二、基于重構的降維 1、PCA 2、核化PCA &#xff08;1&#xff09;實現過程 步驟一&#xff1a;數據映射與核函數定義 步驟二…

代碼的解讀——自用

代碼來自&#xff1a;https://github.com/ChuHan89/WSSS-Tissue?tabreadme-ov-file 借助了一些人工智能 run_pipeline.sh 功能總結 該腳本用于執行一個 弱監督語義分割&#xff08;WSSS&#xff09; 的完整流程&#xff0c;包含三個階段&#xff1a; Stage1&#xff1a;訓…

Powershell和BTEQ工具實現帶多組參數和標簽的Teradata數據庫批量數據導出程序

設計一個基于多個帶標簽SQL模板作為配置文件和多組參數的Powershell代碼程序和BTEQ工具&#xff0c;實現根據不同的輸入參數&#xff0c;自動批量地將Teradata數據庫的數據導出為CSV文件到指定目錄上&#xff0c;標簽和多個參數&#xff08;以“_”分割&#xff09;為組成導出數…

CF 118A.String Task(Java實現)

題目分析 輸入一個字符串&#xff0c;遍歷每一個字符&#xff0c;如果是元音字母就刪除&#xff0c;輔音字母就在其前面增加一個.&#xff0c;且所有字母輸出都是小寫。 思路分析 將輸入的字符串改為字符數組&#xff0c;考慮到任意位置插入的情況&#xff0c;所以主要選擇Lin…

LLM進階

prologue&#xff1a;最近大模型火出天際&#xff0c;I’m definitely aware I’m late to the party&#xff0c;2022年畢業之后就很少在系統的跟蹤一個domain了&#xff0c;所以這次下定決心要跟蹤一下大模型的技術細節和實現過程&#xff0c;不做AI丁真 本文三條主線&#…