深度優先搜尋例題

2021-09-18 00:01:16 字數 4074 閱讀 5177

//輸入m行,n列的陣列,給定起點座標x,y和終點座標w,z,求從起點到終點的路徑數。

//規定可以前後左右移動,但是下一步的值必須比當前值大。

//示例:

//輸入:

//4 5

//0 0 1 0 0

//0 0 2 0 0

//0 0 3 4 0

//0 0 7 5 0

//0 2 3 2

//輸出:

//2//解法:其實就是很簡單的深度優先搜尋

#include using namespace std;

#define maxn 60

int pic[maxn][maxn], vis[maxn][maxn] = , rcount = 0;

int dst[4][2] = ,,, };//按走上下左右的順序

void dfs(int x, int y, int disx, int disy, int m, int n);

int main()

void dfs(int x, int y, int disx, int disy, int m, int n)//傳入初始座標(x,y),終點座標(disx,disy),矩陣大小mxn

for (int i = 0; i < 4; ++i)//列舉轉移狀態

}return;

}

/*

題目描述

現在你面對乙個n×m的矩陣,矩陣中的每乙個元素都是乙個整數,現在你需要計算從矩陣的左上角走到右下角所走過的所有元素相加的最大和。

注意:只能向右或者向下走,不能走出邊界。

解答要求

時間限制:1000ms, 記憶體限制:64mb

輸入輸入第一行包含兩個用空格分開的整數n (1≤ n ≤ 100)和m (1≤ m ≤ 100),表示n行m列的矩陣;接下來是n行每行包含m個用空格分開的非負的整數a (0 ≤ a ≤ 100)。

輸出輸出從矩陣的左上角走到右下角所走過的所有元素相加的最大和。

樣例輸入樣例 1 複製

2 31 2 3

1 0 2

輸出樣例 1

8輸入樣例 2 複製

5 314 14 4

76 5 76

78 23 23

45 75 53

52 43 71

輸出樣例 2

412提示

sample test1中最大和為1+2+3+2=8。

sample test2最大和為14+76+78+45+75+53+71=412

*/#include #include #include using namespace std;

int dir[2][2] = , };

void dfs(vector>& mat, vector>& vis, int& summax, int sumcur, int x, int y);

int main()

}int summax = mat[0][0];

dfs(mat, vis, summax, mat[0][0], 0, 0);

cout << summax << endl;

return 0;

}void dfs(vector>& mat, vector>& vis, int& summax, int sumcur, int n, int m)

for (int i = 0; i < 2; i++)

}return;

}

/*

題目描述

word maze 是乙個網路小遊戲,你需要找到以字母標註的食物,但要求以給定單詞字母的順序吃掉。如上圖,假設給定單詞if,你必須先吃掉i然後才能吃掉f。

但現在你的任務可沒有這麼簡單,你現在處於乙個迷宮maze(n×m的矩陣)當中,裡面到處都是以字母標註的食物,但你只能吃掉能連成給定單詞w的食物。

如下圖,指定w為「solo」,則在地圖中紅色標註了單詞「solo」。

注意區分英文本母大小寫,你只能上下左右行走。

解答要求

時間限制:1000ms, 記憶體限制:64mb

輸入輸入第一行包含兩個整數n、m(0#include #include using namespace std;

int n, m;

int dir[4][2] = , , , };

void dfs(vector& wordmap, vector>& vst, string& w, int x, int y, int wi, bool& isfound);

int main()

vector> vst(n, vector(m, 0));

bool isfound = false;

for (int i = 0; i < n; i++)

if (isfound)

}if (isfound)

}if (!isfound)

if (wordmap[x][y] == w[wi]) else

} else

for (int i = 0; i < 4; i++)

}}

// leetcode 78. 子集

/*給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集(冪集)。

說明:解集不能包含重複的子集。

示例:輸入: nums = [1,2,3]

輸出:[

[3],

[1],

[2],

[1,2,3],

[1,3],

[2,3],

[1,2],  ]

*//*計算組合個數的方法

可取可不取,有兩種情形。根據乘法原理,總共2×2×2 = 2^3 種情形。

用程式實現時,模擬這個過程。設立標記陣列vis,vis[i]=true,表示集合中包含第i個元素。在dfs中依次考慮每個元素,取還是不取,把決策資訊記錄在vis中。到達邊界後,掃瞄vis,輸出一組解。

演算法思想是:依序列舉每個位置。針對每個位置,試著填入取或不取

*/class solution

void dfs(vector& nums, vector& vis, vector>& res, int n)

}res.push_back(tmpres);

return;

}vis[n] = 0;

dfs(nums, vis, res, n + 1);

vis[n] = 1;

dfs(nums, vis, res, n + 1);

vis[n] = 0;

}};

/*

數字 n 代表生成括號的對數,請你設計乙個函式,用於能夠生成所有可能的並且 有效的 括號組合。

示例:輸入:n = 3

輸出:[

"((()))",

"(()())",

"(())()",

"()(())",

"()()()"

]*//*

為了生成所有序列,我們可以使用遞迴。長度為 n 的序列就是在長度為 n-1 的序列前加乙個 '(' 或 ')'。

為了檢查序列是否有效,我們遍歷這個序列,並使用乙個變數 balance 表示左括號的數量減去右括號的數量。如果在遍歷過程中 balance 的值小於零,或者結束時 balance 的值不為零,那麼該序列就是無效的,否則它是有效的。

*/class solution

return balance == 0;

}void generate_all(string& current, int n, vector& result)

current += '(';

generate_all(current, n, result);

current.pop_back();

current += ')';

generate_all(current, n, result);

current.pop_back();

}public:

vectorgenerateparenthesis(int n)

};

深度優先搜尋(DFS)例題

dfs概念 它從某個狀態開始,不斷地轉移狀態直至無法轉移,然後回退到前一步的狀態,繼續轉移其他狀態,如此不斷重複,直至找到最終的解。解題利用的是 遞迴函式。例題 dfs 例題 給定整數a1,a2,a3.an,判斷是否能夠從中抽出幾個整數使得它們的和剛好為k int a max int n,k boo...

DFS深度優先搜尋(附例題)

深度優先搜尋,簡稱dfs,算是應用最廣泛的搜尋演算法,屬於圖演算法的一種,dfs按照深度優先的方式搜尋,通俗說就是 一條路走到黑 dfs是一種窮舉,實質是將所有的可行方案列舉出來,不斷去試探,知道找到問題的解,其過程是對每乙個可能的分支路徑深入到不能再深入為止,且每個頂點只能訪問一次。dfs一般借助...

廣度優先搜尋 深度優先搜尋

前言 這幾天複習圖論演算法,覺得bfs和dfs挺重要的,而且應用比較多,故記錄一下。廣度優先搜尋 有乙個有向圖如圖a 圖a廣度優先搜尋的策略是 從起始點開始遍歷其鄰接的節點,由此向外不斷擴散。1.假設我們以頂點0為原點進行搜尋,首先確定鄰接0的頂點集合s0 2.然後確定頂點1的集合s1 頂點2沒有鄰...