翻幣問題(廣度優先搜尋)

2021-07-11 01:57:59 字數 2285 閱讀 2619

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

只輸出最少次數,其變化過程僅作參考

解題思路:

本題的關鍵是找出從當前狀態如何變化到下一狀態(即變化的規律)。

任意翻轉

5個硬幣,正反面的個數變化為:

5正0反

正-5 

反+54正1反

正-3 

反+33正2反

正-1 

反+12正3反

正+1 

反-11正4反

正+3 

反-30 正5

反正+5 反

-5

程式:
const
maxn=20000;

var
v,f:array[1..maxn] of longint;
n,s:longint;

procedure print(x:longint);
begin
if x=0 then exit;
print(f[x]);
inc(s);
end;

procedure bfs;
var
i,h,t,j:longint;
begin
h:=0;
t:=1;
v[1]:=n;
repeat

inc(h);

for i:=0 to 5 do

if (v[h]>=i) and (n-v[h]>=5-i) then

begin

inc(t);

f[t]:=h;

v[t]:=v[h]-i+5-i;

for j:=1 to t-1 do

if v[j]=v[t] then

begin

dec(t);

break;

end;

if v[t]=0 then

begin

s:=0;

print(t);

writeln(s-1);

t:=0;

end;

end;

until h>=t;
end;

begin
readln(n);
bfs;
end.

細胞問題(廣度優先搜尋)

description 一矩形陣列由數字0到9組成,數字1到9代表細胞,細胞的定義為沿細胞數字上下左右還是細胞數字則為同一細胞,求給定矩形陣列的細胞個數。如 陣列 0234500067 1034560500 2045600671 0000000089 有4個細胞。input 輸入共m 1行第一行有兩...

搜尋 廣度優先搜尋

廣度優先搜尋一層一層地進行遍歷,每層遍歷都是以上一層遍歷的結果作為起點,遍歷乙個距離能訪問到的所有節點。需要注意的是,遍歷過的節點不能再次被遍歷。class solution,int shortestpathbinarymatrix vectorint grid length return 1 cl...

廣度優先搜尋

include include include include using namespace std struct node 圖頂點結構定義 typedef struct node graph 圖形的結構新型態 struct node head 9 圖形頂點陣列 int visited 9 遍歷標...