清華大學 瑪雅人的密碼 bfs解題

2021-08-20 21:25:42 字數 1343 閱讀 3568

題目描述

瑪雅人有一種密碼,如果字串中出現連續的2012四個數字就能解開密碼。給乙個長度為n的字串,(2=

輸入描述

輸入包含多組測試資料,每組測試資料由兩行組成。

第一行為乙個整數n,代表字串的長度(2<=n<=13)。

第二行為乙個僅由0、1、2組成的,長度為n的字串。

輸出描述

對於每組測試資料,若可以解出密碼,輸出

最少的移位次數

;否則輸出-1。

樣例輸入

502120

樣例輸出

1解題思路

由題目可以知道,他要求的是輸出最少的移位次數,可以考慮用bfs來解決。

bfs格式如下:

對應的偽碼如下:

void bfs(graph* g,int start,queue* q)
如果源字串沒有包含「2012」串,我們就要開始呼叫bfs來尋找最小調換次數。

在這裡用了兩個資料結構,map和queue。

#include#includemapm;//m[str]表示str經歷的交換次數

queueq;//佇列,用於bfs

swap函式用來調換一次相鄰字元。

string swap(string s,int i)
然後再判斷是否有「2012」串,如果沒有的話,則push進去佇列等待。
int bfs(string s)

m[s]=0;//代表s的起始交換次數是0

q.push(s);

while(!q.empty())

bool judge(string s)

int bfs(string s)

m[s]=0;//代表s的起始交換次數是0

q.push(s);

while(!q.empty()){

s=q.front();//取出隊首

q.pop();

for(int i=0;i>n){

string s;

cin.get();//吃掉乙個換行符

getline(cin,s);

int len=s.length();

if(judge(s)) {cout<

瑪雅人的密碼bfs

如何用佇列廣度優先遍歷所有可能性 queue 如何判別並標示某串是否訪問過 map 如何記錄某串已經交換字元的次數 子串2012是否存在 include include include include include include using namespace std int count 3 t...

BFS 瑪雅人的密碼

時間限制 1秒 空間限制 65536k 熱度指數 5412 瑪雅人有一種密碼,如果字串 現連續的2012四個數字就能解開密碼。給乙個長度為n的字串,2 示例1 1.典型的bfs題目,節點為字串 2.巧妙地運用map來判斷搜尋樹中是否有重複的節點 3.s.find 2012 string npos 匹...

瑪雅人的密碼 BFS

瑪雅人有一種密碼,如果字串 現連續的2012四個數字就能解開密碼。給乙個長度為n的字串,2 輸入包含多組測試資料,每組測試資料由兩行組成。第一行為乙個整數n,代表字串的長度 2 n 13 第二行為乙個僅由0 1 2組成的,長度為n的字串。對於每組測試資料,若可以解出密碼,輸出最少的移位次數 否則輸出...