2016 6 10 深度優先搜尋練習

2022-09-17 05:36:09 字數 4397 閱讀 4301

時間限制: 1 s

空間限制: 128000 kb

題目等級 : ** gold

在乙個4*4的棋盤上擺放了14顆棋子,其中有7顆白色棋子,7顆黑色棋子,有兩個空白地帶,任何一顆黑白棋子都可以向上下左右四個方向移動到相鄰的空格,這叫行棋一步,黑白雙方交替走棋,任意一方可以先走,如果某個時刻使得任意一種顏色的棋子形成四個一線(包括斜線),這樣的狀態為目標棋局。●○

●○●○

●●○●

○○●○

輸入描述 input description

從檔案中讀入乙個4*4的初始棋局,黑棋子用b表示,白棋子用w表示,空格地帶用o表示。

輸出描述 output description

用最少的步數移動到目標棋局的步數。

樣例輸入 sample input

bwbo

wbwb

bwbw

wbwo

樣例輸出 sample output

1

#define n 5

2 #include3

using

namespace

std;

4 #include5

char

jz[n][n];

6struct

qq[2];9

int xx=;

10int yy=;

11long

long sum=100;/*

假設乙個最大步數,一開始設定太大了,直接爆了棧空間

*/12

int t=-1;13

bool

check()14

26}27if(biaozhi) return

true;28

}29for(int i=1;i<=4;++i)30

40}41if(biaozhi) return

true;42

}43bool biaozhi=true;44

char s=jz[1][1

];45

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

4652}53

if(biaozhi) return

true

;54 biaozhi=true

;55 s=jz[1][4

];56

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

5763}64

if(biaozhi) return

true;65

return

false;66

}67void dfs(bool fla,long

long

bushu)

6875

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

7692

if(!fla&&jz[x1][y1]=='b'

)93102}

103}

104}

105}

106int

main()

107118

}119

}120

//swap(q[0],q[1]);

121bool flag=;

122for(int j=0;j<2;++j)

123 dfs(flag[j],0

);124 cout125return0;

126 }

2023年noip全國聯賽普及組

時間限制: 1 s

空間限制: 128000 kb

題目等級 : ** gold

已知 n 個整數 x1,x2,…,xn,以及乙個整數 k(k<n)。從 n 個整數中任選 k 個整數相加,可分別得到一系列的和。例如當 n=4,k=3,4 個整數分別為 3,7,12,19 時,可得全部的組合與它們的和為:

3+7+12=22  3+7+19=29  7+12+19=38  3+12+19=34。

現在,要求你計算出和為素數共有多少種。

例如上例,只有一種的和為素數:3+7+19=29)。

輸入描述 input description

鍵盤輸入,格式為:

n , k (1<=n<=20,k<n)

x1,x2,…,xn (1<=xi<=5000000)

輸出描述 output description

螢幕輸出,格式為:

乙個整數(滿足條件的種數)。

樣例輸入 sample input

4 33 7 12 19

樣例輸出 sample output

資料範圍及提示 data size & hint

(1<=n<=20,k<n)

(1<=xi<=5000000)

1

/*順便複習miller_rabin演算法*/2

#define n 21

3 #include4

using

namespace

std;

5 #include6 #include7 #include8 typedef long

long

ll;9

inta[n],n,k;

10 ll ans=0;11

void

input()

1217

ll quick_mod(ll a,ll b,ll c)

1828 a=(a*a)%c;

29 b>>=1;30

}31return

ans;32}

33bool

miller_rabin(ll n)

3443

for(ll i=1;i<=10;++i)

4454

if(x!=1) return

false;55

}56return

true;57

}58void

dfs(ll xh,ll sum,ll djg)

5966

if(n-xhreturn;67

for(ll i=1;i<=n;++i)

6872}73

intmain()

7481 cout82return0;

83 }

時間限制: 1 s

空間限制: 128000 kb

題目等級 : ** gold

輸入描述 input description

輸入的第一行包含2個整數n(1≤n

≤8),m(1≤m

≤10)。表示有n種不同型別的本子和m種小寒喜歡的顏色。接下來乙個n*m的矩陣。第i行第j列的整數aij表示在第i種型別的本子中包含小寒喜歡的顏色j的紙有aij(1≤aij

≤100)張。再接下來的一排n個整數b1到bn,表示每種顏色的本子在超市中有多少本(1≤bi

≤5)。

輸出描述 output description

輸出包含乙個整數,表示小松最少需要折的蝴蝶數目,如果該數目超過1000,則輸出」alternative!」。(由於可能存在多種買本子的方案,所以這裡就不要求輸出具體方案了)

樣例輸入 sample input

2 32 1 2

4 8 4

5 5樣例輸出 sample output

1

#define n 11

2 #include3

using

namespace

std;

4 #include5

intb[n],jz[n][n],n,m,a[n];

6int flag=false;7

void

input()816

bool check(int

xz)17

22void dfs(int k,int

xz)23

29if(k==n) return;30

for(int i=k+1;i<=n;++i)

3144}45

if(fla)

4651

dfs(i,xz);

52if(flag) return

; 53

for(j=1;j<=m;++j)

5457}58

}59}60

intmain()

6181}82

if(fla)

8388

dfs(i,k);

89for(j=1;j<=m;++j)

9093}94

}95if(k*m>1000)96

100if(flag) break

;101

}102 printf("

%d\n

",m*k);

103return0;

104 }

DFS深度優先搜尋練習

題意 用 代表油田,八個方向互相連線,把相連的油田看作一塊油田,問你最多有多少塊油田。思路 本題其實本質就是乙個迷宮問題,所以我們就可以用dfs或者bfs,本題我們當然採用dfs,用乙個vis標記一下,然後從頭開始遍歷,如果這個點等於 並且vis為0時,開始bfs一次,記錄bfs的次數,bfs的次數...

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

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

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

深度優先搜尋 depth first search 簡稱dfs。最直觀的例子就是 走迷宮 廣度優先搜尋 每個頂點都要進出一遍佇列,每個邊也都會被訪問一次,所以 時間複雜度o v e 主要消耗記憶體的是visited prev陣列 queue佇列,所以 空間複雜度o v 深度優先搜尋 每條邊最多會被訪...