漢諾塔專題:P1760 通天之漢諾塔 題解 + Problem D: 漢諾塔 題解

1.? P1760 通天之漢諾塔 題解

題目背景

直達通天路·小A歷險記第四篇

題目描述

在你的幫助下,小 A 成功收集到了寶貴的數據,他終于來到了傳說中連接通天路的通天山。但是這距離通天路仍然有一段距離,但是小 A 突然發現他沒有地圖!!!但是幸運的是,他在山腳下發現了一個寶箱。根據經驗判斷(小 A 有經驗嗎?),地圖應該就在其中!

在寶箱上,有三根柱子以及在一根柱子上的?n?個圓盤。小 A 在經過很長時間判斷后,覺得這就是 hanoi 塔!(這都要琢磨)。但是移動是需要時間的,所以小 A 必須要通過制造延壽藥水來完成這項任務。現在,他請你告訴他需要多少步完成,以便他造足夠的延壽藥水。

輸入格式

一個數?n,表示有?n?個圓盤。

輸出格式

一個數?s,表示需要?s?步。

輸入輸出樣例

輸入 #1

31

輸出 #1

2147483647

輸入 #2

15

輸出 #2

32767

說明/提示

數據范圍及約定

對于所有數據,n≤15000。

代碼:

#include <iostream>
#include <vector>using namespace std;int main() {int n;cin >> n;vector<int> digits;digits.push_back(1); // 初始為1,逆序存儲for (int i = 0; i < n; ++i) {int carry = 0;for (int j = 0; j < digits.size(); ++j) {int temp = digits[j] * 2 + carry;digits[j] = temp % 10;carry = temp / 10;}if (carry != 0) {digits.push_back(carry);}}// 減一操作int borrow = 1;for (int i = 0; i < digits.size() && borrow != 0; ++i) {digits[i] -= borrow;if (digits[i] < 0) {digits[i] += 10;borrow = 1;} else {borrow = 0;}}// 去除前導零while (!digits.empty() && digits.back() == 0) {digits.pop_back();}if (digits.empty()) {cout << 0;} else {for (auto it = digits.rbegin(); it != digits.rend(); ++it) {cout << *it;}}cout << endl;return 0;
}

代碼解釋:

代碼邏輯分析

1. 輸入處理
  • 讀取整數?n,表示需要計算的次方數。
2. 初始化大數存儲
  • 使用動態數組?digits???逆序存儲??大數,初始值為?[1]即?20=1)。
  • 逆序存儲意味著低位在前,高位在后。例如,數值 123 存儲為?[3, 2, 1]
3. 計算?2^n
  • 通過 ??n?次循環??,每次將當前數值乘以 2。
  • ??處理進位??:
    • 遍歷每一位數字,計算?當前位 × 2 + 進位
    • 更新當前位為結果的個位,進位為十位。
    • 若所有位處理完仍有進位,將其作為新高位加入數組。

??示例??:初始為 1,計算?23=8:

  • 第1次循環:1×2 → 2 →?[2]
  • 第2次循環:2×2 → 4 →?[4]
  • 第3次循環:4×2 → 8 →?[8]
4. 減一操作
  • 從最低位開始借位減一:
    • 若當前位減一后為負數,加 10 并設置借位。
    • 否則,直接減一并結束借位。

??示例??:2^4=16?減一:

  • 數值 16 存儲為?[6, 1]
  • 減一后,低位 6 → 5,無借位,結果為?[5, 1](即 15)。
5. 去除前導零
  • 逆序存儲中前導零位于數組末尾,需移除。
  • 若所有位均為零,最終輸出 0。
6. 輸出結果
  • 逆序輸出數組,得到正確的高位到低位順序。

代碼示例解析(以?n=3?為例)

  1. ??計算?2^3=8??:
    • 初始?digits = [1]
    • 3次循環后,digits = [8](逆序存儲 8)。
  2. ??減一??:
    • 8 - 1 = 7?→?digits = [7]
  3. ??輸出??:
    • 逆序輸出?7

2.?Problem D: 漢諾塔 題解

Description

????????有三根柱A,B,C在柱A上有N塊盤片,所有盤片都是大的在下面,小片能放在大片上面。現要將A上的N塊片移到C柱上,每次只能移動一片,而且在同一根柱子上必須保持上面的盤片比下面的盤片小,請輸出移動的步驟。

Input

????????輸入整數n,表示有n塊盤片

Output

????????輸出移動的步驟

  • Sample Input

3

  • Sample Output
1 A->C
2 A->B
3 C->B
4 A->C
5 B->A
6 B->C
7 A->C
HINT

0 < n < 20

代碼:

#include <cstdio>
#include <vector>
#include <string>
#include <cstring>using namespace std;vector<string> steps;
int step = 0;void hanoi(int n, char from, char to, char via) {if (n == 1) {step++;char buffer[20];snprintf(buffer, sizeof(buffer), "%d %c->%c", step, from, to);steps.emplace_back(buffer);} else {hanoi(n - 1, from, via, to);step++;char buffer[20];snprintf(buffer, sizeof(buffer), "%d %c->%c", step, from, to);steps.emplace_back(buffer);hanoi(n - 1, via, to, from);}
}int main() {int n;scanf("%d", &n);steps.reserve((1 << n) - 1); // 預分配足夠內存hanoi(n, 'A', 'C', 'B');// 計算總輸出長度size_t total_len = 0;for (const auto& s : steps) {total_len += s.size() + 1; // 每行加換行符}// 合并到緩沖區并一次性輸出char* buffer = new char[total_len];char* ptr = buffer;for (const auto& s : steps) {size_t len = s.size();memcpy(ptr, s.c_str(), len);ptr += len;*ptr++ = '\n';}fwrite(buffer, 1, total_len, stdout);delete[] buffer;return 0;
}

代碼解釋:

  1. ??漢諾塔獨特遞歸算法??:

    • hanoi?函數遞歸地將?n?個盤子從起始柱?from?移動到目標柱?to,借助中間柱?via
    • 當?n=1?時,直接將盤子從?from?移到?to,記錄步驟。
    • 對于?n>1,分解為三步:
      • 將?n-1?個盤子從?from?移至?via(遞歸調用)。
      • 將第?n?個盤子從?from?移至?to
      • 將?n-1?個盤子從?via?移至?to(遞歸調用)。
  2. ??記錄步驟??:

    • 使用全局變量?stepsvector<string>)存儲每一步操作。
    • 每移動一個盤子,遞增全局變量?step,并用?snprintf?格式化為字符串(如?"1 A->C")存入?steps
  3. ??性能優化??:

    • ??內存預分配??:steps.reserve((1 << n) - 1)?預分配足夠內存,避免?vector?動態擴容的開銷。
    • ??單次輸出??:計算所有步驟字符串的總長度,合并到連續內存緩沖區,通過?fwrite?一次性輸出,減少頻繁I/O操作的開銷。
  4. ??代碼結構??:

    • ??全局變量??:steps?和?step?簡化參數傳遞,但在多線程環境中不安全(此處單線程無問題)。
    • ??遞歸實現??:清晰體現漢諾塔問題分治思想,時間復雜度為 O(2?)。
    • ??輸入輸出??:scanf?讀取盤子數?n,高效輸出避免逐行打印。

??總結??:遞歸解決漢諾塔問題,記錄每一步移動步驟,并通過內存預分配和單次輸出優化性能,適合高效生成并輸出大量步驟的場景。

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

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

相關文章

探索 HumanoidBench:類人機器人學習的新平臺

在科技飛速發展的當下&#xff0c;類人機器人逐漸走進我們的視野&#xff0c;它們有著和人類相似的外形&#xff0c;看起來能像人類一樣在各種環境里完成復雜任務&#xff0c;潛力巨大。但實際上&#xff0c;讓類人機器人真正發揮出實力&#xff0c;還面臨著重重挑戰。 這篇文…

數據結構中的寶藏秘籍之廣義表

廣義表&#xff0c;也被稱作列表&#xff08;Lists&#xff09;&#xff0c;是一種遞歸的數據結構。它就像一個神秘的盒子&#xff0c;既可以裝著單個元素&#xff08;原子&#xff09;&#xff0c;也可以嵌套著其他的盒子&#xff08;子列表&#xff09;。比如廣義表 (a (b c)…

【jenkins】首次配置jenkins

第一步&#xff0c;輸入管理員密碼 cat /var/jenkins_home/secrets/initialAdminPassword第二步&#xff0c;點擊安裝推薦的插件 第三步&#xff0c;創建管理員用戶 第四步&#xff0c;返回實例 第五步&#xff0c; 升級jenkins 第六步&#xff0c; 修復提示 第七步&#xff0c…

Android studio—socketIO庫return與emit的使用

文章目錄 一、Socket.IO庫簡單使用說明1. 后端 Flask Flask-SocketIO2. Android 客戶端集成 Socket.IO3. 布局文件注意事項 二、接受服務器消息的二種方法1. 客戶端接收通過 emit 發送的消息功能使用場景后端代碼&#xff08;Flask-SocketIO&#xff09;客戶端代碼&#xff08…

用Prompt 技術【提示詞】打造自己的大語言智能體

機器如何按照人類的指令執行任務的探索 機器需具備理解任務敘述的能力&#xff0c;以便能夠按照人類的指令執行任務&#xff0c;為機器提供一些范例作為參考&#xff0c;使其能夠理解該執行的任務類型。這樣的學習方式稱為“Instruction learning”&#xff0c;透過精心設計的…

Node.js 數據庫 事務 項目示例

1、參考&#xff1a;JavaScript語言的事務管理_js 函數 事務性-CSDN博客 或者百度搜索&#xff1a;Nodejs控制事務&#xff0c; 2、實踐 2.1、對于MySQL或MariaDB&#xff0c;你可以使用mysql或mysql2庫&#xff0c;并結合Promise或async/await語法來控制事務。 使用 mysql2…

【Mamba】MambaVision論文閱讀

文章目錄 MambaVision一、研究背景&#xff08;一&#xff09;Transformer vs Mamba?&#xff08;二&#xff09;Mamba in CV? 二、相關工作?&#xff08;一&#xff09;Transformer 在計算機視覺領域的進展?&#xff08;二&#xff09;Mamba 在計算機視覺領域的探索? 三、…

前端面試寶典---原型鏈

引言----感謝大佬的講解 大佬鏈接 原型鏈示意圖 原型鏈問題中需要記住一句話&#xff1a;一切變量和函數都可以并且只能通過__proto__去找它所在原型鏈上的屬性與方法 原型鏈需要注意的點 看上圖可以發現 函數&#xff08;構造函數&#xff09;也可以通過__proto__去找到原…

C語言---FILE結構體

一、FILE 結構體的本質與定義 基本概念 FILE 是 C 語言標準庫中用于封裝文件操作的結構體類型&#xff0c;定義于 <stdio.h> 中。它代表一個“文件流”&#xff0c;可以是磁盤文件、標準輸入輸出&#xff08;stdin/stdout/stderr&#xff09;或其他輸入輸出設備。 實現特…

基于大模型的直腸息肉診療全流程風險預測與方案優化研究報告

目錄 一、引言 1.1 研究背景與意義 1.2 研究目的與創新點 二、大模型技術概述 2.1 大模型原理簡介 2.2 大模型在醫療領域應用現狀 三、直腸息肉術前預測與準備 3.1 基于大模型的術前風險預測 3.1.1 息肉性質預測 3.1.2 手術難度預測 3.2 基于預測結果的術前準備 3.…

華為OD機試真題——MELON的難題(2025A卷:200分)Java/python/JavaScript/C++/C語言/GO六種最佳實現

2025 A卷 200分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析&#xff1b; 并提供Java、python、JavaScript、C、C語言、GO六種語言的最佳實現方式&#xff01; 2025華為OD真題目錄全流程解析/備考攻略/經驗分享 華為OD機試真題《MELON的…

AI數據分析與BI可視化結合:解鎖企業決策新境界

大家好&#xff0c;今天我們來聊聊一個前沿而熱門的話題——AI數據分析與BI可視化結合&#xff0c;如何攜手推動企業決策邁向新高度。在數據爆炸的時代&#xff0c;企業如何高效利用這些數據&#xff0c;成為制勝的關鍵。AI數據分析與BI可視化的結合&#xff0c;正是解鎖這一潛…

克服儲能領域的數據處理瓶頸及AI拓展

對于儲能研究人員來說&#xff0c;日常工作中經常圍繞著一項核心但有時令人沮喪的任務&#xff1a;處理實驗數據。從電池循環儀的嗡嗡聲到包含電壓和電流讀數的大量電子表格&#xff0c;研究人員的大量時間都花在了提取有意義的見解上。長期以來&#xff0c;該領域一直受到對專…

【SpringBoot+Vue自學筆記】002 SpringBoot快速上手

跟著這位老師學習的&#xff1a;https://www.bilibili.com/video/BV1nV4y1s7ZN?vd_sourceaf46ae3e8740f44ad87ced5536fc1a45 最好和老師的idea版本完全一致&#xff01;截至本文寫的當日最新的idea好像默認jdk17&#xff0c;配置時遇到很多bug。 &#x1f33f; Spring Boot&a…

SpringAI+DeepSeek大模型應用開發——2 大模型應用開發架構

目錄 2.大模型開發 2.1 模型部署 2.1.1 云服務-開放大模型API 2.1.2 本地部署 搜索模型 運行大模型 2.2 調用大模型 接口說明 提示詞角色 ?編輯 會話記憶問題 2.3 大模型應用開發架構 2.3.1 技術架構 純Prompt模式 FunctionCalling RAG檢索增強 Fine-tuning …

藍橋杯12. 日期問題

日期問題 原題目鏈接 題目描述 小明正在整理一批歷史文獻。這些歷史文獻中出現了很多日期。 小明知道這些日期都在 1960 年 1 月 1 日 至 2059 年 12 月 31 日 之間。 令小明頭疼的是&#xff0c;這些日期采用的格式非常不統一&#xff1a; 有的采用 年/月/日有的采用 月…

STM32使用rand()生成隨機數并顯示波形

一、隨機數生成 1、加入頭文件&#xff1a;#include "stdlib.h" 2、定義一個用作生成隨機數種子的變量并加入到滴答定時器中不斷自增&#xff1a;uint32_t run_times 0; 3、設置種子&#xff1a;srand(run_times);//每次生成隨機數前調用一次為佳 4、生成一個隨…

『前端樣式分享』聯系我們卡片式布局 自適應屏幕 hover動效 在wikijs中使用 (代碼拿來即用)

目錄 預覽效果分析要點響應式網格布局卡片樣式&#xff1a;陰影和過渡效果 代碼優化希望 長短不一的郵箱地址在左右居中的同時,做到左側文字對齊(wikijs可用)總結 歡迎關注 『前端布局樣式』 專欄&#xff0c;持續更新中 歡迎關注 『前端布局樣式』 專欄&#xff0c;持續更新中…

【ubuntu】在Linux Yocto的基礎上去適配Ubuntu的wifi模塊

一、修改wifi的節點名 1.找到wifi模塊的PID和VID ifconfig查看wifi模塊網絡節點的名字&#xff0c;發現是wlx44876393bb3a&#xff08;wlxmac地址&#xff09; 通過udevadm info -a /sys/class/net/wlx44876393bba路徑的命令去查看wlx44876393bba的總線號&#xff0c;端口號…

健康養生:開啟活力生活新篇章

在當代社會&#xff0c;熬夜加班、久坐不動、外賣快餐成為許多人的生活常態&#xff0c;隨之而來的是各種亞健康問題。想要擺脫身體的疲憊與不適&#xff0c;健康養生迫在眉睫&#xff0c;它是重獲活力、擁抱美好生活的關鍵。? 應對不良飲食習慣帶來的健康隱患&#xff0c;飲…