BFS 翻幣問題

2021-10-02 01:14:51 字數 1026 閱讀 2780

description

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

input

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

output

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

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

sample input

sample output

解析

任意翻轉5個硬幣,正反面的個數變化為:

5正0反 正-5 反+5

4正1反 正-3 反+3

3正2反 正-1 反+1

2正3反 正+1 反-1

1正4反 正+3 反-3

0 正5反 正+5 反-5

即有6種變化,用state[i]表示節點i正面的個數,完成翻轉即正面的個數為0,在執行上面6種翻轉時要檢查是否符合翻條件,即正面的個數和反面的個數要大於其對應的翻轉數,生成新節點時要判斷此節點是否出現過,否則就會出現相同的5個硬幣翻來翻去的情況。

**

#include

#include

using

namespace std;

int n,a[

20005

],fa[

20005

],t[

20005

],ans[

20005];

void

bfs()}

}}while

(head<=tail);}

intmain()

翻幣問題 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行至最後一行 先是乙個整數,表...