搜尋與回溯演算法是計算機解題中的常用的演算法
基本思想:
為了求得問題的解,先選擇某一種可能情況向前探索,在探索過程中,一旦發現原來的選擇是錯誤的,就退回一步重新選擇,繼續向前探索,如此反覆進行,直至得到解或證明無解。搜尋與回溯演算法是為了解決無法根據某種確定的計算法則來求解的問題,可以利用搜尋與回溯的技術求解
演算法框架[一]
intsearch
(int k)}}
演算法框架[二]
intsearch
(int k)
}}
各位比較喜歡第二種
【題目1】
迷宮:乙個迷宮,可以上下左右走,問可不可以從給定的乙個點走到另乙個點
詳見一本通t1215
【題目分析】
這是一道經典的回溯題目,這個題目可以從上下左右走,走到牆則返回,否則繼續走,直到走到終點或者無解
我們可以使用框架【一】
來解
#include
#include
#include
using
namespace std;
bool flag=
false
;int n,m;
int x,y,a,b;
int vis[
105]
[105];
int p[4]
[2]=
,,,}
;//方向(上下左右)
void
dfs(
int x,
int y)
else
dfs(xx,yy);}
}}intmain()
} cin>>x>>y>>a>>b;
if(vis[x]
[y]||vis[a]
[b])
//如果起始點是牆或者終點是牆
else
dfs(x,y)
;//起始點傳參if(
!flag)
cout<<
"no"
<}return0;
}
【流程】以起始點為引數(x,y),每次朝不同的方向(上下左右)走,碰到牆則返回,如果下乙個位置的座標是終點,直接輸出有解;直到無法到達終點,輸出無解時結束2
【題目2】
紅與黑:
有一間長方形的房子,地上鋪了紅色、黑色兩種顏色的正方形瓷磚。你站在其中一塊黑色的瓷磚上,只能向相鄰的黑色瓷磚移動。計算你總共能夠到達多少塊黑色的瓷磚。
詳見一本通t1216
#include
#include
#include
using
namespace std;
int tot;
int n,m;
int vis[25]
[25],a[25]
[25];
int p[4]
[2]=
,,,}
;void
dfs(
int x,
int y)}}
intmain()
else
if(s==
'.')
a[i]
[j]=1;
else
if(s==
'#')
a[i]
[j]=0;
}}vis[x]
[y]=1;
dfs(x,y)
; cout<}return0;
}
【題目3】
馬走日:
馬踏八方,棋盤上的馬從乙個點開始走,問馬可以有多少途徑遍歷棋盤上的所有點
【題目分析】
馬踏八方,這次馬可以朝八個方向走去,那麼走過的地方不可再走,繼續朝其他方向去走,直到發現走完了或者沒走完時返回
#include
#include
#include
using
namespace std;
int n,m,x,y;
int ans;
int a[15]
[15];
int vis[15]
[15];
int p[8]
[2]=
,,,,
,,,}
;void
dfs(
int x,
int y,
int cur)
for(
int i=
0; i<
8; i++)}
}int
main()
return0;
}
撒花!撒花! 搜尋與回溯演算法
搜尋與回溯是計算機解題中常用的演算法,很多問題無法根據某種確定的計算法則來求解,可以利用搜尋與回溯的技術來求解。回溯是搜尋演算法中的一種控制策略。回溯的基本思想是 為了求得問題的解,先選擇某一種可能的情況向前探索,在探索過程中,一旦發現原來的選擇是錯誤的,就退回一步重新選擇,繼續向前探索,如此反覆進...
搜尋與回溯
搜尋與回溯 本詞條由 科普中國 科學百科詞條編寫與應用工作專案 審核 回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就 回溯 返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優...
搜尋與回溯
p1157 組合的輸出 原題見洛谷。這道題是非常典型的搜尋與回溯,主要就是把所有可能篩一遍並依次輸出。search寫法 include using namespace std int num 0,a 10001 n,r bool b 10001 void print dfs寫法 include us...