2019-2020年高中信息技術(shù) 全國青少年奧林匹克聯(lián)賽教案 搜索法二.doc
《2019-2020年高中信息技術(shù) 全國青少年奧林匹克聯(lián)賽教案 搜索法二.doc》由會員分享,可在線閱讀,更多相關(guān)《2019-2020年高中信息技術(shù) 全國青少年奧林匹克聯(lián)賽教案 搜索法二.doc(4頁珍藏版)》請在裝配圖網(wǎng)上搜索。
2019-2020年高中信息技術(shù) 全國青少年奧林匹克聯(lián)賽教案 搜索法二 在深度優(yōu)先搜索算法中,深度越大的結(jié)點越先得到擴(kuò)展,若把它改為深度越小的結(jié)點越先得到擴(kuò)展,就是廣度優(yōu)先搜索法。 廣度優(yōu)先搜索基本算法: program bfs; 初始化;建立隊列data; 設(shè)隊列首指針closed:=0;隊列尾指針open:=1; repeat closed 增1,取出closed所指結(jié)點進(jìn)行擴(kuò)展; for i:=1 to r do begin if 子結(jié)點符合條件then begin open增1,并把新結(jié)點存入數(shù)據(jù)庫隊尾; if新結(jié)點與原有結(jié)點有重復(fù) then 刪于該結(jié)點(open減1) else if 新結(jié)點即目標(biāo) then 輸出并退出 ; end{if}; end{for}; until closed>=open;{隊列為空} 使用廣度優(yōu)先搜索時,離根結(jié)點最近的結(jié)點先擴(kuò)展,所以廣度優(yōu)先搜索法比較適合求步數(shù)最少的解,由于深度優(yōu)先使用了標(biāo)志法,使得存儲空間大大減少,而廣度優(yōu)先要保留所有搜索過的節(jié)點,隨著搜索程度的加深,所需的存儲空間成指數(shù)增加。因此在必要時我們采用雙向搜索來減少搜索空間和存儲空間,如下面的例子。 廣度優(yōu)先算法應(yīng)用 例 字串變換(NOIPxxtg) [問題描述]:已知有兩個字串 A$, B$ 及一組字串變換的規(guī)則(至多6個規(guī)則): A1$ -> B1$ A2$ -> B2$ 規(guī)則的含義為:在 A$中的子串 A1$ 可以變換為 B1$、A2$ 可以變換為 B2$ …。例如:A$=abcd B$=xyz 變換規(guī)則為:‘a(chǎn)bc’->‘xu’ ‘ud’->‘y’ ‘y’->‘yz’ 則此時,A$ 可以經(jīng)過一系列的變換變?yōu)?B$,其變換的過程為:‘a(chǎn)bcd’->‘xud’->‘xy’->‘xyz’ 共進(jìn)行了三次變換,使得 A$ 變換為B$。 [輸入]:鍵盤輸人文件名。文件格式如下: A$ B$ A1$ B1$ \ A2$ B2$ |-> 變換規(guī)則 ... ... / 所有字符串長度的上限為 20。 [輸出]:輸出至屏幕。格式如下: 若在 10 步(包含 10步)以內(nèi)能將 A$ 變換為 B$ ,則輸出最少的變換步數(shù);否則輸出"NO ANSWER!" [輸入輸出樣例] b.in: abcd xyz abc xu ud y y yz 屏幕顯示:3 算法分析:此題是求變換的最少步數(shù),很顯然可以使用廣度優(yōu)先搜索法,如果直接從初狀態(tài)搜到目標(biāo)狀態(tài),最壞情況下存儲的結(jié)點數(shù)超過6的10次方冪,搜索空間過大,因此我們考慮使雙向搜索,同時從初始狀態(tài)和目標(biāo)狀態(tài)向中間狀態(tài)搜索,當(dāng)相遇時搜索結(jié)束。采用雙向搜索,存儲的結(jié)點數(shù)還有可能超限,我們在前向搜索隊列中存儲5步內(nèi)變換的結(jié)點,在后向搜索隊列中,由于第5步產(chǎn)生的結(jié)點只是用來與前向隊列中的結(jié)點比較,所以可以不存儲在隊列中,后向搜索隊列只需存儲4步內(nèi)的結(jié)點,這樣就解決了存儲空間問題。 為了使用方便,在程序設(shè)計中用一個數(shù)組a[1..max]存儲兩個隊列,前向搜索隊列為a[1..mid],后向搜索隊列為a[mid..max],用st存儲搜索方向,st=0表示前向搜索,st=1表示后向搜索,用op[st]和cl[st]分別表示隊列尾指針和首指針,用be表示隊列起始位置,循環(huán)產(chǎn)生每一個結(jié)點,若在10內(nèi)無解退出循環(huán),若在10內(nèi)找到解則輸出解并退出程序。 源程序: const mid=1xx;max=16000; type node=record s:string;x:byte;end; var i,mark:integer; a:array [1..max]of ^node; x:array[0..6,0..1]of string[20]; d,fil:string; op,cl:array [0..1] of integer; procedure Init;{讀取數(shù)據(jù),初始化} var f:text;t:string; begin readln(fil); assign(f,fil);reset(f);i:=0; while not eof(f) do begin readln(f,t); x[i,0]:=copy(t,1,pos( ,t)-1); x[i,1]:=copy(t,pos( ,t)+1,length(t)); inc(i); end;{while} mark:=i-1;close(f); end; {判斷是否到達(dá)目標(biāo)狀態(tài)} procedure bool(be,st:integer); begin for i:=mid-be+1 to cl[1-st] do if a[cl[st]]^.s=a[i]^.s then begin writeln(a[cl[st]]^.x+a[i]^.x); halt; end;{if} end; {判斷節(jié)點是否與前面的結(jié)點重復(fù)} procedure check(be,st:integer); begin for i:=be+1 to cl[st]-1 do if a[i]^.s=a[cl[st]]^.s then begin dec(cl[st]);exit; end; bool(be,st); end; {擴(kuò)展產(chǎn)生新節(jié)點} procedure expand(be,st:integer); var i,j,k,lx,ld:integer; begin inc(op[st]);d:=a[op[st]]^.s; k:=a[op[st]]^.x;ld:=length(d); for i:=1 to mark do begin lx:=length(x[i,st]); for j:=1 to ld do begin if (copy(d,j,lx)=x[i,st]) then begin if (st<>1)or(k<>4)then begin inc(cl[st]); new(a[cl[st]]); end;{if} a[cl[st]]^.s:= copy(d,1,j-1)+ x[i,1-st]+ copy(d,j+lx,ld); a[cl[st]]^.x:=k+1; check(be,st);{檢查是否重復(fù)} end;{if} end;{for} end;{for} end; procedure bfs; var be,k,st:integer; Begin for st:=0 to 1 do begin if st=0 then be:=0 else be:=mid; op[st]:=be+0;cl[st]:=be+1; new(a[cl[st]]); a[cl[st]]^.s:=x[0,st]; a[cl[st]]^.x:=0; end;{for} repeat if (op[0]- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 2019-2020年高中信息技術(shù) 全國青少年奧林匹克聯(lián)賽教案 搜索法二 2019 2020 年高 信息技術(shù) 全國青少年 奧林匹克 聯(lián)賽 教案 搜索
鏈接地址:http://m.hcyjhs8.com/p-2564503.html