AcWing 842. 排列數字——算法基礎課題解

AcWing 842. 排列數字

題目描述

給定一個整數 𝑛,將數字 1~𝑛 排成一排,將會有很多種排列方法。

現在,請你按照字典序將所有的排列方法輸出。

輸入格式

共一行,包含一個整數 𝑛。

輸出格式

按字典序輸出所有排列方案,每個方案占一行。

數據范圍

1≤𝑛≤7

輸入樣例

3

輸出樣例

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

C++

#include <iostream>using namespace std;const int N = 10;
int n, path[N];
bool st[N]; // 狀態數組void dfs(int u) {if (u == n)// 遞歸到最后一個數字{for (int i = 0; i < n; i++) printf("%d ", path[i]); // 輸出保存的結果puts(" ");}for (int i = 1; i <= n; i++)if (!st[i]) // 沒有被用過的數{path[u] = i;st[i] = true; // i被用過dfs(u + 1);// 走到下一層st[i] = false;// 恢復現場}
}int main() {scanf("%d", &n);dfs(0);return 0;
}
#include <iostream>using namespace std;const int N = 10;int n;
int path[N];void dfs(int u, int state) {if (u == n) {for (int i = 0; i < n; i++) printf("%d ", path[i]);puts("");return;}for (int i = 0; i < n; i++)if (!(state >> i & 1)) {path[u] = i + 1;dfs(u + 1, state + (1 << i));}
}int main() {scanf("%d", &n);dfs(0, 0);return 0;
}

state變量通過位運算來跟蹤哪些數字已經被使用過。我們可以通過一個簡單的例子來詳細說明這一過程:

假設我們要找出 1 到 3 的所有排列。

初始化

  • state初始化為 0(二進制表示為000),表示沒有任何數字被使用。

第一層遞歸

我們從數字 1 開始嘗試,直到數字 3。

  • 嘗試數字 1:
    • 檢查數字 1 是否已使用:state >> 0 & 1 (即000 >> 0 & 1)結果為 0,表示數字 1 未使用。
    • 更新statestate + (1 << 0)(即000 + 001),現state變為001,表示數字 1 已使用。
    • 進入下一層遞歸。

第二層遞歸

此時,state001,表示數字 1 已被使用。

  • 嘗試數字 1:
    • 檢查數字 1 是否已使用:state >> 0 & 1 (即001 >> 0 & 1)結果為 1,跳過。
  • 嘗試數字 2:
    • 檢查數字 2 是否已使用:state >> 1 & 1 (即001 >> 1 & 1)結果為 0,表示數字 2 未使用。
    • 更新statestate + (1 << 1)(即001 + 010),現state變為011,表示數字 1 和 2 已使用。
    • 進入下一層遞歸。

第三層遞歸

此時,state011

  • 嘗試數字 1:
    • 檢查數字 1 是否已使用:state >> 0 & 1 (即011 >> 0 & 1)結果為 1,跳過。
  • 嘗試數字 2:
    • 檢查數字 2 是否已使用:state >> 1 & 1 (即011 >> 1 & 1)結果為 1,跳過。
  • 嘗試數字 3:
    • 檢查數字 3 是否已使用:state >> 2 & 1 (即011 >> 2 & 1)結果為 0,表示數字 3 未使用。
    • 更新statestate + (1 << 2)(即011 + 100),現state變為111,表示數字 1、2 和 3 已使用。
    • 找到排列:1 2 3。

回溯

完成當前分支后,遞歸函數將結束當前層的執行并返回上一層,同時state的值也會恢復到進入當前層之前的狀態(通過局部變量的作用域自然實現),這樣就可以繼續嘗試其他的數字組合。

Go

package mainimport ("bufio""fmt""os"
)const N = 10var (n      intpath   [N]intst     [N]boolwriter = bufio.NewWriter(os.Stdout)
)func dfs(u int) {if u == n {for i := 0; i < n; i++ {writer.WriteString(fmt.Sprintf("%d ", path[i]))}writer.WriteString("\n")return}for i := 1; i <= n; i++ {if !st[i] {path[u] = ist[i] = truedfs(u + 1)st[i] = false}}
}func main() {defer writer.Flush()reader := bufio.NewReader(os.Stdin)fmt.Fscan(reader, &n)dfs(0)
}
package mainimport ("bufio""fmt""os"
)const N = 10var (n      intpath   [N]intwriter = bufio.NewWriter(os.Stdout)
)func dfs(u int, state int) {if u == n {for i := 0; i < n; i++ {writer.WriteString(fmt.Sprintf("%d ", path[i]))}writer.WriteString("\n")return}for i := 0; i < n; i++ {if (state>>i)&1 == 0 {path[u] = i + 1dfs(u+1, state|(1<<i))}}
}func main() {defer writer.Flush()reader := bufio.NewReader(os.Stdin)fmt.Fscan(reader, &n)dfs(0, 0)
}

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

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

相關文章

【Unity性能優化】使用多邊形碰撞器網格太多,性能消耗太大了怎么辦

&#x1f468;?&#x1f4bb;個人主頁&#xff1a;元宇宙-秩沅 &#x1f468;?&#x1f4bb; hallo 歡迎 點贊&#x1f44d; 收藏? 留言&#x1f4dd; 加關注?! &#x1f468;?&#x1f4bb; 本文由 秩沅 原創 &#x1f468;?&#x1f4bb; 專欄交流&#x1f9e7;&…

【機器學習基礎】Python編程04:五個實用練習題的解析與總結

Python是一種廣泛使用的高級編程語言,它在機器學習領域中的重要性主要體現在以下幾個方面: 簡潔易學:Python語法簡潔清晰,易于學習,使得初學者能夠快速上手機器學習項目。 豐富的庫支持:Python擁有大量的機器學習庫,如scikit-learn、TensorFlow、Keras和PyTorch等,這些…

一道java線程池面試題

線程池面試題 一個線程池的核心線程數為10個&#xff0c;最大線程數為20個&#xff0c;阻塞隊列的容量為30。現在提交45個 任務&#xff0c;每個任務的耗時為500毫秒。 請問&#xff1a;這批任務執行完成總共創建幾個線程&#xff1f; 請問&#xff1a;這批任務執行完成總計需…

快團團有貨源的供貨大團長如何給單個訂單發貨?

快團團團長給單個訂單發貨的步驟如下&#xff1a; 登錄快團團商家后臺&#xff1a;首先&#xff0c;你需要以團長的身份登錄快團團的商家后臺管理系統。 進入訂單管理頁面&#xff1a;登錄后&#xff0c;在后臺導航中找到并點擊“訂單管理”或類似的選項&#xff0c;進入訂單列…

C語言中的#和##操作符用法

C語言中#和##操作符用法 答&#xff1a;在C語言中&#xff0c;#和##是預處理器&#xff08;preprocessor&#xff09;的操作符&#xff0c;主要用于宏&#xff08;macro&#xff09;的定義中。這兩個操作符提供了字符串化和字符串連接的功能。 #操作符 #操作符用于將其后的宏…

算法人生(19): 從“LangChain的六大組件”看“個人職業規劃”

我們今天要說說和大模型有著密切關系的Langchain &#xff0c;它提供了一個平臺&#xff0c;讓開發者可以更加輕松地訓練、部署和管理這些大模型。具體來說&#xff0c;Langchain 可以通過提供高性能的計算資源、靈活的模型管理和部署選項、以及豐富的監控和調試功能&#xff0…

Python語言試卷:深入剖析Python編程的精髓

Python語言試卷&#xff1a;深入剖析Python編程的精髓 在編程的世界里&#xff0c;Python以其簡潔、易讀和強大的功能贏得了眾多開發者的青睞。為了全面檢驗大家對Python語言的理解程度&#xff0c;本試卷將從四個方面、五個方面、六個方面和七個方面展開深入剖析&#xff0c;…

企業軟件產品和服務 之 設計保證安全 七項承諾

1. 引言 公司如何保護自己免受數據泄露的影響&#xff1f;標準答案就是&#xff1a; “啟用多因素身份驗證”——MTA&#xff08;Enable multifactor authentication&#xff09;。 但是&#xff0c;目前很多公司仍然盲目地只使用密碼作為唯一的身份來源。 網絡安全的核心是…

Python怎么定義類:深入探索與實戰解析

Python怎么定義類&#xff1a;深入探索與實戰解析 在Python編程的廣闊天地中&#xff0c;定義類是一項基礎且至關重要的技能。類作為面向對象編程的核心構造&#xff0c;為我們提供了一種組織和封裝代碼、創建可重用對象的方式。今天&#xff0c;我們將從四個方面、五個方面、…

【分享】兩種方法設置PDF“打開密碼”

想要保護PDF文件的私密性&#xff0c;只允許特定人查看&#xff0c;我們可以給PDF設置“打開密碼”&#xff0c;這樣只有知道密碼的人才可以打開文件。如果小伙伴們不知道如何設置&#xff0c;就一起看看以下兩種方法吧&#xff01; 方法1&#xff1a;使用PDF編輯器 大部分PD…

Leetcode:羅馬數字轉整數

題目鏈接&#xff1a;13. 羅馬數字轉整數 - 力扣&#xff08;LeetCode&#xff09; 普通版本&#xff08;模擬&#xff09; 分析&#xff1a;通常情況下&#xff0c;羅馬數字中小的數字在大的數字的右邊。若輸入的字符串滿足該情況&#xff0c;累加每個字符對應的數值即可&am…

HarmonyOS(二十四)——Harmonyos通用事件之觸摸事件

1.觸摸事件。 觸摸事件是HarmonyOS通用事件的一種事件之一&#xff0c;當手指在組件上按下、滑動、抬起時觸發。 名稱是否冒泡功能描述onTouch(event: (event?: TouchEvent) > void)是手指觸摸動作觸發該回調&#xff0c;event返回值見下面TouchEvent介紹。 2. TouchEve…

埃隆·馬斯克 - 從夢想家到改變世界的企業家

埃隆馬斯克 - 從夢想家到改變世界的企業家 本文內容是埃隆馬斯克傳的重點章節精華提煉&#xff0c;介紹了馬斯克傳奇一生 參考資料內容&#xff1a;埃隆馬斯克傳&造夢者埃隆馬斯克 參考資料在文末獲取&#xff0c;關注我&#xff0c;分享優質前沿資料&#xff08;IT、運…

交互設計專業解析:發展前景和薪資待遇

交互式設計專業是一門旨在幫助人們更好地與數字產品和服務互動的設計學科。交互式設計專業涉及人機交互、用戶體驗設計、用戶界面設計等多個不同領域。交互式設計是當今數字時代不可缺少的一部分。它能為用戶提供更好的體驗和更高效的功能&#xff0c;為企業創造更高的價值和影…

LabVIEW儲油罐監控系統

LabVIEW儲油罐監控系統 介紹了基于LabVIEW的儲油罐監控系統的設計與實施。系統通過集成傳感器技術和虛擬儀器技術&#xff0c;實現對儲油罐內液位和溫度的實時監控&#xff0c;提高了油罐監管的數字化和智能化水平&#xff0c;有效增強了油庫安全管理的能力。 項目背景 隨著…

買賣股票的各種最佳時機問題

買賣股票的最佳時機 分析 根據題意可知&#xff0c;我們只需要找出來一個最小價格的股票和一個最大價格的股票&#xff0c;并且最小價格的股票出現在最大價格的股票之前。 如果嘗試使用暴力解法&#xff0c;時間復雜度為O(N^2)&#xff0c;對于題目中給的長度&#xff0c;顯然…

金士頓U盤被寫保護的解決方法

1.適用的U盤芯片信息 USB設備ID: VID 0951 PID 1666 設備供應商: Kingston 設備名稱: DataTraveler 3.0 設備修訂版: 0110 產品制造商: Kingston 產品型號: DataTraveler 3.0 產品修訂版: PMAP 主控廠商: Phison(群聯) 主控型號: PS2251-07(PS2307) - F/W 08.03.50 [2018-…

從學士-碩士-博士-博士后-副教授-教授-優青-杰青-長江-院士:一文看懂學術巨人的成長歷程

會議之眼 快訊 學術之路&#xff0c;如同攀登一座高聳入云的山峰&#xff0c;需要毅力、智慧和不斷的求知探索。從奠定基礎的學士&#xff0c;到站在學術巔峰的院士。這條成長之路充滿了挑戰和機遇。 如果把學術界比作王者榮耀&#xff0c;那么學者們的成長歷程就像是在進行一…

SpringBoot-SchedulingConfigurer源碼初識:理解定時任務拋異常終止本次調度,但不會影響下一次執行調度

SchedulingConfigurer源碼初識&#xff1a;理解定時任務拋異常終止本次調度&#xff0c;但不會影響下一次執行調度 EnableSchedulingScheduledAnnotationBeanPostProcessor進入finishRegistration方法 ScheduledTaskRegistrar處理觸發器任務&#xff08;TriggerTask&#xff09…

F5G城市光網,助力“一網通城”筑基數字中國

《淮南子》中說&#xff0c;“臨河而羨魚&#xff0c;不如歸家織網”。 這句話在后世比喻為做任何事情都需要提前做好準備&#xff0c;有了合適的工具&#xff0c;牢固的基礎&#xff0c;各種難題也會迎刃而解。 如今&#xff0c;數字中國發展建設如火如荼&#xff0c;各項任務…