藍橋杯 歷屆試題 青蛙跳杯子 九宮重排

2021-08-17 08:37:59 字數 2946 閱讀 7763

問題描述

x星球的流行寵物是青蛙,一般有兩種顏色:白色和黑色。

如下圖,有一排杯子,左邊的乙個是空著的,右邊的杯子,每個裡邊有乙隻青蛙。

*wwwbbb

其中,w字母表示白色青蛙,b表示黑色青蛙,*表示空杯子。

x星的青蛙很有些癖好,它們只做3個動作之一:

1. 跳到相鄰的空杯子裡。

2. 隔著1只其它的青蛙(隨便什麼顏色)跳到空杯子裡。

3. 隔著2只其它的青蛙(隨便什麼顏色)跳到空杯子裡。

對於上圖的局面,只要1步,就可跳成下圖局面:

www*bbb

本題的任務就是已知初始局面,詢問至少需要幾步,才能跳成另乙個目標局面。

輸入為2行,2個串,表示初始局面和目標局面。

輸出要求為乙個整數,表示至少需要多少步的青蛙跳。

樣例輸入

*wwbb

wwbb*

樣例輸出 2

樣例輸入

www*bbb

bbb*www

樣例輸出 10

資料規模和約定

我們約定,輸入的串的長度不超過15

資源約定:

峰值記憶體消耗(含虛擬機器) < 256m

cpu消耗 < 1000ms

請嚴格按要求輸出,不要畫蛇添足地列印類似:「請您輸入...」 的多餘內容。

所有**放在同乙個原始檔中,除錯通過後,拷貝提交該原始碼。

不要使用package語句。不要使用jdk1.7及以上版本的特性。

主類的名字必須是:main,否則按無效**處理。

----------------------------

笨笨有話說:

我夢見自己是一棵大樹,

青蛙跳躍,

我就發出新的枝條,

春風拂動那第 5 層的新枝,

哦,我已是枝繁葉茂。

這個問題如果知道思路的話,並不是很難,但是想到這個思路就真的非常困難,所以把重點放在了如何根據這個題想到的使用bfs來做。

首先我們知道只有乙個'*'在這個字串中,那麼也就是兩邊的青蛙可以跳到這個空位置上來的只有六個,那麼在這個跳完了之後,在這種形態之下,我們緊接著往後進行,那麼我們就會利用到之前的狀態,如果利用了之前的狀態,我們就會發現,別的方法大多都是從這一條路一直走到天黑,如果這條路錯了的話,才會回頭,只有bfs會記錄下之前的每乙個狀態,從這乙個狀態下,新增新的狀態,所以還是bfs解決這個問題會好一些。

#include #include #include #include #include #include #include #include #define inf 0x3f3f3f3f

using namespace std;

typedef long long ll;

const int maxn = 20;

string str,ans;

int dir[6] = ;

struct node //結構體表示跳每一次的狀態

node()

};queueq; //bfs佇列

void bfs()}}

}void init()

void solve()

int main()

問題描述

如下面第乙個圖的九宮格中,放著 1~8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。

我們把第乙個圖的局面記為:12345678.

把第二個圖的局面記為:123.46758

顯然是按從上到下,從左到右的順序記錄數字,空格記為句點。

本題目的任務是已知九宮的初態和終態,求最少經過多少步的移動可以到達。如果無論多少步都無法到達,則輸出-1。

輸入格式

輸入第一行包含九宮的初態,第二行包含九宮的終態。

輸出格式

輸出最少的步數,如果不存在方案,則輸出-1。

樣例輸入

12345678.

123.46758

樣例輸出

3樣例輸入

13524678.

46758123.

樣例輸出

22問題和上面的類似,只不過如果這裡使用map中字串相互匹配的話,很容易就會超時,所以將map中的字串匹配轉換為數字的匹配,這裡面1234.5678轉換為數字就是:123456784  最後一位表示小數點所在的位置,這樣就樂意解決了

#include #include #include #include #include #include #include #include #define inf 0x3f3f3f3f

#define ll long long

using namespace std;

const int maxn = 15;

int dir[9][4] = ,,,,,,,,};

int cnt[9] = ;

string ans;

struct state

state(){}

};mapm;

queueque;

int get_num(string a)

num = num*10 + pos;

return num;

}int bfs()}}

return -1;

}int main()

first.step = 0;

m[get_num(first.str)] = 1;

que.push(first);

cout<

}

藍橋杯歷屆試題 青蛙跳杯子

歷屆試題 青蛙跳杯子 時間限制 1.0s 記憶體限制 256.0mb 問題描述 x星球的流行寵物是青蛙,一般有兩種顏色 白色和黑色。如下圖,有一排杯子,左邊的乙個是空著的,右邊的杯子,每個裡邊有乙隻青蛙。wwwbbb 其中,w字母表示白色青蛙,b表示黑色青蛙,表示空杯子。x星的青蛙很有些癖好,它們只...

藍橋杯 歷屆試題 青蛙跳杯子 c

青蛙跳杯子 時間限制 1.0s 記憶體限制 256.0mb wwwbbb 其中,w字母表示白色青蛙,b表示黑色青蛙,表示空杯子。x星的青蛙很有些癖好,它們只做3個動作之一 1.跳到相鄰的空杯子裡。2.隔著1只其它的青蛙 隨便什麼顏色 跳到空杯子裡。3.隔著2只其它的青蛙 隨便什麼顏色 跳到空杯子裡。...

藍橋杯 歷屆試題 青蛙跳杯子(C )

www bbb 本題的任務就是已知初始局面,詢問至少需要幾步,才能跳成另乙個目標局面。輸入為2行,2個串,表示初始局面和目標局面。輸出要求為乙個整數,表示至少需要多少步的青蛙跳。樣例輸入 wwbb wwbb 樣例輸出 2樣例輸入 www bbb bbb www 樣例輸出 10廣搜,思路 借鑑 歷屆試...