河內塔(Hanoi)問題.

Slides:



Advertisements
Similar presentations
1.2 应用举例 ( 一 ). 复习引入 B C A 1. 什么是正弦定理? 复习引入 B C A 1. 什么是正弦定理? 在一个三角形中,各边和它所对 角的正弦的比相等,即.
Advertisements

必修2 第一单元 古代中国经济的基本结构和特点
C语言程序设计 主讲教师 :张群燕 电话:
親愛的老師您好 感謝您選用本書作為授課教材,博碩文化準備本書精選簡報檔,特別摘錄重點提供給您授課專用。 說明: 博碩文化:
每节一经典 用系统的观点观察问题 总体设计,逐步求精 计算机科学学院 王小明 (博士/教授/博士生导师)
计算学科的基本问题 本章首先介绍一个对问题进行抽象的典型实例——哥尼斯堡七桥问题。然后,通过“梵天塔”问题和“停机问题”分别介绍学科中的可计算问题和不可计算问题。从“梵天塔”问题再引出算法复杂性中的难解性问题、P类问题和NP类问题,证比求易算法,P=NP是否成立的问题。
“八皇后”问题 崔萌萌 吕金华.
Loops.
高中信息技术新课程探讨 算法与程序设计教学实践与探讨 江苏省新海高级中学  张丽.
第三单元 发展社会主义民主政治.
3.3 资源的跨区域调配 ——以南水北调为例 铜山中学 李启强.
中间件 定义:中间件是介于应用与操作系统之间的系统软件,是相关应用的基准平台 三大基础软件:操作系统、数据库、中间件
Operating System Concepts 作業系統原理 Chapter 3 行程觀念 (Process Concept)
C语言程序设计 第十二章 位运算.
第5章 函数与模块化设计 学习目的与要求: 掌握函数的定义及调用方法 理解并掌握参数的传递方法 理解函数的嵌套与递归调用
高级语言程序设计 主讲人:陈玉华.
選擇排序法 通訊一甲 B 楊穎穆.
C的發展史 C程式初體驗 C程式設計基本注意事項 上機實習課程
chapter 1-Introduction
佇列 (Queue).
Chap 10 函数与程序结构 10.1 函数的组织 10.2 递归函数 10.3 宏定义 10.4 编译预处理.
If … else 選擇結構 P27.
搜尋資料結構 Search Structures.
STRUCTURE 授課:ANT 日期:2010/5/12.
QQ: 李祥 QQ: 欢迎多种方式的学习交流,祝大家学有所成.
计算概论 第十八讲 C语言高级编程 结构与习题课 北京大学信息学院.
第八章 函数.
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第7章 编译预处理 本章要求: 本章重点: 本章难点: 掌握用#define定义无参数宏和带有参数宏定义和调用方法;
作弊是否很有诱惑性? 上堂课已经讲了 作业不一定在两个小时里都能完成 答疑没有一个人? 作弊是有记录的 心理系很多同学集体作弊,让人震惊
进程操作.
第3章 堆栈和队列 堆栈 堆栈应用 队列 队列应用 优先级队列 主要知识点.
第三章 栈和队列 3.1 栈 3.2 栈的应用举例 3.3 栈与递归的实现 3.4 队列.
第三章 栈和队列.
多维数组与指针 用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。 1. 多维数组元素的地址 先回顾多维数组的性质,可以认为二维数组是“数组的数组”,例 : 定义int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
THE C PROGRAMMING LANGUAGE
計數式重複敘述 for 迴圈 P
第三章 数据类型、运算符与表达式.
第九章 预处理命令.
第0章作业: 教材P12-练习与实践 1.写出用符号’*’输出描绘汉字”大”的流程图。
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
C语言概述 第一章.
C语言大学实用教程 第5章 函数与程序结构 西南财经大学经济信息工程学院 刘家芬
Chap7 Recursive.
第一章 程序设计和C语言 主讲人:高晓娟 计算机学院.
C程序设计.
Main() { Dfas Asdfasf fasdfa } #include <stdio.h> void main( ) {
Chap2 Stack & Queue.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
第十四章 若干深入问题和C独有的特性 作业: 函数指针 函数作参数 函数副作用 运算 语句 位段 存储类别 编译预处理
C程序设计.
第一章 C语言概述 教师:周芸.
C语言程序设计 李祥 QQ:
資料結構與C++程式設計進階 遞迴(Recursion) 講師:林業峻 CSIE, NTU 6/ 17, 2010.
项目1 C程序设计起步 学习目标: 通过该项目你可以知道: C语言的用途。 C语言的基本符号和关键字。 C语言程序的结构及特点。
第一章 C语言概述 目录 什么是语言、程序 C语言的历史与发展 C语言的书写形式与程序结构 运行C语言的步骤与方法
第二章 类型、对象、运算符和表达式.
累堆排序法 (Heap Sort).
第二章 基本数据类型 ——数据的表示.
本节内容 函数嵌套调用的内存布局 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第十二章 位运算.
7.2 正弦公式 附加例題 1 附加例題 2.
第18讲 从C到C++ 计算机与通信工程学院.
C/C++基礎程式設計班 C語言入門、變數、基本處理與輸入輸出 講師:林業峻 CSIE, NTU 3/7, 2015.
C/C++基礎程式設計班 陣列 講師:林業峻 CSIE, NTU 3/14, 2015.
Chap 10 函数与程序结构 10.1 圆形体积计算器 10.2 汉诺塔问题 10.3 长度单位转换 10.4 大程序构成.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
函式庫補充資料 1.
隨機函數.
Presentation transcript:

河內塔(Hanoi)問題

河內塔是由三根柱子,和n個不同直徑的圓盤所組成,它的遊戲方法是,將這n個圓盤由其一個柱子,全部搬至另一個柱子上,它的遊戲規則如下: 在搬動的過程中,直徑大的一定要在直徑小的圓盤下面。   一次只能搬動一個圓盤,且圓盤只能在這三個柱子之間移動,不得超出範圍。  

演算法:虛擬碼 若有k個圓盤,則圓盤移動的總次數為: 2k-1+2k-2+…+2k-k=2k-1 設三個木樁為a 、 b 、 c,數量為n,而函式則為Hanoi (n , a , b , c) 當N為1時表示只要再移動一次就完成工作,也就是只要把a移到c就完成工作。 當N不為1時,作2個動作 1.執行Hanoi(n-1,a,c,b) 2.執行Hanoi(n-1,b,a,c)

void Hanoi(int n , a, b,c) { if (n ==1) 列印 Move disk 1 form a to c; else Hanoi(n-1,a,b,c); 列印Move disk n form a to c; Hanoi(n-1,b,c,a); 列印 Move disk 1~n-1 form b to c }

C語言:程式碼 #include <stdio.h> //#define SHOW_DETAILS #ifdef SHOW_DETAILS int Max_Disks; #endif

void enter_recursion(int n, int from, int to, int middle) { #ifdef SHOW_DETAILS printf(">>進入第 %d 層遞迴深度: (n=%d, from=%d, to=%d, mid=%d)\n", Max_Disks - n, n, from, to, middle); #endif }

void leave_recursion(int n, int from, int to, int middle) { #ifdef SHOW_DETAILS printf("<<離開第 %d 層遞迴深度: (n=%d, from=%d, to=%d, mid=%d)\n", Max_Disks - n, n, from, to, middle); #endif }

void move_a_disk(int from, int to) { printf("從 %d 搬到 %d\n", from, to); } /* 從第 from 個柱子起,透過第 middle 個柱子當中介, 將 n 負碟子搬到第 to 個柱子上。*/

void hanoi(int n, int from, int to, int middle) { if (n <= 1) move_a_disk(from, to); else { /* 第一步驟 */ enter_recursion(n-1, from, middle, to); hanoi(n-1, from, middle, to); leave_recursion(n-1, from, middle, to);

/* 第二步驟 */ move_a_disk(from, to); /* 第三步驟 */ enter_recursion(n-1, middle, to, from); hanoi(n-1, middle, to, from); leave_recursion(n-1, middle, to, from); } } /* hanoi */

int main() { int number; printf("How many disks do you want to start with? "); scanf("%d", &number); if (number < 1) { printf("Sorry, the number must be greater than zero.\n"); return 1; } # ifdef SHOW_DETAILS Max_Disks = number; # endif printf("Now we're trying to move %d disks from 1 to 3...\n", number); hanoi(number, 1, 3, 2);

應用-老鼠迷宮

老鼠走迷宮是實驗心理學家常做的一項實驗,在這實驗中老鼠被置於一個無頂大盒子的入口處,盒子中利用牆將大部份移動去向阻隔起來,這樣科學家們就可以仔細觀察老鼠再迷宮中如何移動直到最後抵達另一端出口為止。從出口到入口只有一條路徑,而在最後出口處有一塊香甜的乳酪在等著。在這實驗中每當老鼠走錯路徑時就得重頭來,一直到它能正確無誤地一次走到出口為止,而這個實驗的次數也就代表老鼠學習的曲線。

老鼠走迷宮

二維陣列的宣告 struct offsets { short int vert; short int horiz; }; struct offsets move[4];

可移動的方向

佇列在電腦資料處理的應用

佇列在電腦資料處理的應用 佇列在電腦中的應用與堆疊不同,大多屬於硬體處理流程的控制。佇列具有先進先出的特性,經常被電腦的作業系統用來安排電腦執行工作 (job) 的優先順序。尤其是多人使用 (Multiuser) 之多工 (Multitask) 電腦必須安排每一位使用者都有相等的電腦使用權。為了公平起見,大都採先要求先服務之原則,而少數特權要求則用優先佇列來控制。   另一種應用我們稱之為Spooling,它是採用佇列的特性將磁碟當做資料輸入及輸出的緩衝區 (Buffer),當資料輸入時先暫存於磁碟,再依序送入電腦處理。  

事件驅動程式 (Event-driven Programs) 一般的資料處理模式多半是一種資料驅動 (data-driven) 的方式如下圖所示:

資料處理模式=>資料驅動 (data-driven) 之流程圖

資料處理模式 → 事件驅動 (event-driven) 之流程圖

程式佇列 (Process Queue) 所謂的程序 (processes) 指的是正在執行的程式。所謂的「多工」指的是電腦在一個時段內能夠同時執行多個程式。譬如:多工的作業系統 (如MS Windows 95、IBM OS/2) 能夠讓一個使用者同時編輯文書、編譯程式、和上網路抓取資料。如此一來,提高了使用者的工作效率。或者,多工的作業系統也可以提供許多使用者同時使用同一部電腦 (如UNIX) 使得電腦達到最大的使用效率。  

資料處理模式 → Process Queue之流程圖

系統模擬 佇列在計算機科學中一個重要的應用就是系統模擬(System simulation),它是用來建立真實世界狀況的模型,而由其中獲取知識,真實狀況下的每一事物和動作,在程式中都有對應的模擬項目。 高速公路的車輛數、時速、以及我們希望最小的延遲時間和達到最大流量,可以藉由系統模擬得出應該要提供多少線道,才能達到需求量。