模板
1判斷邊界
2剪枝3嘗試放入並判斷,
4標記,最後回溯 (3 4兩步可以調換)
#include
using
namespace std;
int a[
10000000]=
;int n;
int tot=0;
void
search
(int cur)
cout<
}return;}
else
for(
int i=
0;iif(ok)
search
(cur+1)
;//如果合法,則遞迴 }}
intmain()
奇怪的電梯
#include
using
namespace std;
int r[
100000]=
;int s[
100000]=
;int n,a,b;
int sum=
100000000
;void
dfs(
int cur,
int click)
if(cur>b||cur<1)
return;if
(click>sum)
return
;//剪枝
r[cur]=1
;//標記,像此類操作少的,可以統一進行標記回溯.
if(cur+s[cur]
<=n&&
!r[cur+s[cur]])
dfs(cur+s[cur]
,click+1)
;if(cur-s[cur]
>=1&&
!r[cur-s[cur]])
dfs(cur-s[cur]
,click+1)
; r[cur]=0
;//回溯
}int
main()
else cout<<
"-1"
;}
bfs版本:
#include
using
namespace std;
struct node
node()
:cur(0
),step(0
)};queue q;
int n,a,b;
int s[
1000000]=
;int vis[
1000000]=
;node t;
intmain()
if(t.cur+s[t.cur]
<=b&&
!vis[t.cur+s[t.cur]])
if(t.cur-s[t.cur]
>=1&&
!vis[t.cur-s[t.cur]])
}if(t.cur==b)cout<
else cout<<
"-1";}
/*總結bfs:
1壓入隊頭
2取隊頭
3判斷4遍歷壓入,標記vis
//無重疊部分,返回0
}void
solve
(string strnow,
int lengthnow,
int cur)}}
main()
選數字
#include
using
namespace std;
int n,k;
int a[
1000000]=
;int vis[
100000]=
;int sum=0;
void
dfs(
long
long
int l,
int cur,
int cnt)}if
(l==i)
return;}
if(cur>k)
return
;//剪枝
for(
int i=cnt;i
}int
main()
考前臨時抱佛jiao
#include
using
namespace std;
int a[4]
[25]=
;int s[4]
=;int m,ans=0;
int l,r;
void
dfs(
int x,
int y)
//嘗試往左右腦放題目;
l+=a[x]
[y];
dfs(x,y+1)
; l-
=a[x]
[y];
r+=a[x]
[y];
dfs(x,y+1)
; r-
=a[x]
[y];
}int
main()
}for
(int i=
0;i<
4;i++
) cout<
}
搜尋 bfs,dfs 專題3 迷宮問題
include using namespace std int n,m,t int a 100 1000 int vis 100 1000 int x,y,x2,y2 int sum 0 int dx 4 打表 int dy 4 打表 void dfs int l,int r vis l r 1 d...
八皇后 搜尋
檢查乙個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行 每列有且只有乙個,每條對角線 包括兩條主對角線的所有平行線 上至多有乙個棋子。上面的布局可以用序列2 4 6 1 3 5來描述,第i個數字表示在第i行的相應位置有乙個棋子,如下 行號 1 2 3 4 5 6 列號 2 4 6 1...
搜尋練習題(1)八皇后
檢查乙個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行 每列有且只有乙個,每條對角線 包括兩條主對角線的所有平行線 上至多有乙個棋子。上面的布局可以用序列2 4 6 1 3 5來描述,第i個數字表示在第i行的相應位置有乙個棋子,如下 行號 1 2 3 4 5 6 列號 2 4 6 1...