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 遍歷標...