發表文章

程式競程入門:基本輸入與輸出

此篇文章是以 C/C++ 程式語言做為程式競程中,資料的輸入與輸出來示範的。 在程式競賽(APCS、ZeroJudge、UVa Online Judge)中,最重要的第一步就是學會如何讀取輸入資料(Input)以及輸出答案(Output)。 一、C++語言的輸入與輸出 C++ 主要使用 iostream 標頭檔中的 cin 與 cout。在競程中,為了提升 standard I/O 的效能,通常會在 main() 函式開頭加上「I/O 優化」程式碼。 輸出(Output) C++使用 cout  與運算子 << 將資料顯示在螢幕上。 基本語法 cout << "要輸出的文字內容" ; cout << variableName; 範例 # include <iostream> using namespace std; int main () { int x = 33 ; cout << "變數x的數值為:" << x; return 0 ; } 執行結果: 變數x的數值為:33 輸出多個資料 string name = "Tom" ; int age = 18 ; cout << "姓名:" << name << " 年齡:" << age; 輸出結果: 姓名:Tom 年齡:18 換行 cout << "第一行" << endl; cout << "第二行" << endl; 或 cout << "第一行\n" ; cout << "第二行\n" ; 輸入(Input) C++使用 cin  與運算子 >> 從標準輸入讀取資料。 基本語法 cin >> variableName; 範例 # include <iostream> using namespace std;...

Tree Search Overview

Tree Search Overview Tree Search is used to find a path from a start state to a goal state. Each node represents a state: A / | \ B C D /|\ | /\ E F G H I J The objective is to reach node J. 1. Breadth-First Search (BFS) Idea Explore nodes level by level. Level 0: A Level 1: B C D Level 2: E F G H I J Expansion order: A → B → C → D → E → F → G → H → I → J Uses a Queue (FIFO) . Advantages Finds shortest path in unweighted graphs. Complete. Disadvantages High memory consumption. 2. Depth-First Search (DFS) Idea Go as deep as possible before backtracking. Expansion order: A → B → E → F → G → C → H → D → I → J Uses a Stack (LIFO) . Advantages Low memory usage. Simple implementation. Disadvantages May miss the shortest path. Can get trapped in deep branches. 3. Best-First Search Idea Expand the node with the smallest heuristic value. h(n) where: h(n) = estimated distance to goal Example: Node h(n) B 1 D 3 C 6 ...

Tree Search(樹狀搜尋)

一、什麼是 Tree Search(樹狀搜尋)? 在人工智慧(AI)與演算法中,許多問題都可以表示成一棵樹(圖一): 起點(A) / | \ B C D /|\ | / \ E F G H I J 每個節點(Node)代表一種狀態(State)。 例如: 迷宮中的位置 棋局的盤面 路徑規劃中的城市 遊戲中的決策 搜尋演算法的目的: 從起點找到目標節點(Goal Node) 二、Breadth First Search (BFS) 核心思想 先搜尋離起點最近的節點。 一層一層往外擴展。 Level 0: A Level 1: B C D Level 2: E F G H I J 搜尋順序: A B C D E F G H I J 圖一結果: A → B → C → D → E → F → G → H → I → J 使用資料結構 Queue(佇列) FIFO: First In First Out 先進先出 例如: Queue: A 取出A 加入B,C,D Queue: B,C,D BFS特性 優點 如果邊權重相同: BFS一定找到最短路徑。 缺點 需要大量記憶體。 假設每個節點有10個子節點: 深度5: 10^5 = 100000 需要保存很多節點。 時間複雜度 O(V + E) V = Vertex(節點數) E = Edge(邊數) 三、Depth First Search (DFS) 核心思想 一路往下走到底。 不能走才回頭。 A | B | E 然後: A | B | F 搜尋順序 圖一結果: A B E F G C H D I J 使用資料結構 Stack(堆疊) LIFO Last In First Out 後進先出 例如: push(B) push(C) push(D) pop() => D DFS特性 優點 記憶體需求小。 只需保存: 目前路徑 即可。 缺點 可能找到很差的解。 例如: A ├── Goal └── 巨大子樹 DFS可能先跑完整個巨大子樹。 時間複雜度 O(V+E)...