BFS 翻幣問題

2021-10-01 07:41:14 字數 1370 閱讀 8777

description

有n個硬幣(6<=n<=20000)全部正面朝上排成一排,每次將其中5個硬幣翻過來放在原位置,直到最後全部硬幣翻成反面朝上為止。試程式設計找出步數最少的翻法,輸出最少步數及翻法。

input

從鍵盤輸入乙個正整數n(6<=n<=20000),表示硬幣的數量。

output

第1行:乙個整數,表示最少步數

第2行至最後一行:先是乙個整數,表示步驟序號(從0開始編號),後接乙個":",再接當前硬幣的狀態(用乙個整數表示正面朝上的硬幣的個數)

sample input

6 (開始:6個硬幣正面朝上)

sample output

0:6 (第0步結果:6個硬幣正面朝上)

1:1 (第1步結果:1個硬幣正面朝上)

2:4 (第2步結果:4個硬幣正面朝上)

3:3 (第3步結果:3個硬幣正面朝上)

4:2 (第4步結果:2個硬幣正面朝上)

5:5 (第5步結果:5個硬幣正面朝上)

6:0 (第6步結果:0個硬幣正面朝上)

6 (最少用6步實現全部反面朝上)

hint

只輸出最少次數,其變化過程僅作參考 (沒看到這句話,被坑了)

解題思路

廣搜

把翻硬幣情況列舉出來:

佇列只記錄正面數量v[h

ead]

v[head]

v[head

],反面數量就等於n−v

[hea

d]

n-v[head]

n−v[he

ad]只列舉翻幾個正面i

ii,翻反面數量就等於5−i

5-i5−

i如果可以翻面的話,就擴充套件了乙個情況(隊尾)

設乙個a

aa作為桶,記錄正面數量v[t

ail]

v[tail]

v[tail

]的情況出現過沒有

#include

#include

#include

using namespace std;

int n,a[

200200];

int f[

200200

],h,t=1;

void

bfs(

) a[f[t]

]=a[f[h]]+

1;if(

!f[t]

)return;}

}}}int main()

翻幣問題 BFS

有n個硬幣 6 n 20000 全部正面朝上排成一排,每次將其中5個硬幣翻過來放在原位置,直到最後全部硬幣翻成反面朝上為止。試程式設計找出步數最少的翻法,輸出最少步數及翻法。input 從鍵盤輸入乙個正整數n 6 n 20000 表示硬幣的數量。output 第1行 乙個整數,表示最少步數 第2行至...

BFS 翻幣問題

description 有n個硬幣 6 n 20000 全部正面朝上排成一排,每次將其中5個硬幣翻過來放在原位置,直到最後全部硬幣翻成反面朝上為止。試程式設計找出步數最少的翻法,輸出最少步數及翻法。input 從鍵盤輸入乙個正整數n 6 n 20000 表示硬幣的數量。output 第1行 乙個整數...

翻幣問題 題解

有n個硬幣 6 n 20000 全部正面朝上排成一排,每次將其中5個硬幣翻過來放在原位置,直到最後全部硬幣翻成反面朝上為止。試程式設計找出步數最少的翻法,輸出最少步數及翻法。從鍵盤輸入乙個正整數n 6 n 20000 表示硬幣的數量。第1行 乙個整數,表示最少步數 第2行至最後一行 先是乙個整數,表...