首先題目說若在10步之內有解就輸出步數,十步之內無解就是no answer,這就說明了搜尋的深度不會超過十步,可以考慮用迭代搜尋。迭代深搜基本框架和資料的讀入寫好之後,就是處理細節了,剛開始打算用鍊錶做,結果自不常用鍊錶,一直寫錯,後來發現可以用string類裡面的find函式和replace函式來解決題目中的替換問題,find函式的作用是在a串中找到b串第一次出現的地方,用法a.find(b) 。而replace可以將a串從第m位開始的len個字元替換成b串,用法a.replace(m,len,b)。然後就高高興興打出了**,結果交上去只有80分,最後乙個點wa。(沒有進行任何剪枝操作,題目時限比較寬裕,居然沒有乙個點tle)。先貼上80分**。
#include
#include
#include
using
namespace std;
string st1;
string st2;
const
int maxn=15;
int ok=0;
struct methodp[maxn]
;string ss1,ss2;
int cnt;
int d;
//迭代加深的深度
void
dfs(
int cur,string st)if(
!ok)
dfs(cur+
1,ss);}
}int
main()
for(d=
1;d<=
10&&
!ok;d++)if
(!ok) cout<<
"no answer!"
;return0;
}
然後就開始處理wa的點,搞了半天發現這個寫法存在的問題在於忽略了同一種操作可能會在乙個串中執行多次的可能,比如
aabbaaa這個串,如果變換規則中有aa ——> b ,那麼這個串就可以有多個變換位點,而上面的**只考慮了第一次出現的aa。所以就要對同乙個規則執行多次find,然後改進**之後又不對了,比如這個例子,find函式每次都找的是第乙個出現的aa,最後只能死迴圈。百思不得其解之下查閱了一些其它題解,發現了find函式還有乙個引數,可以規定查詢從第幾位開始,這樣就可以記錄下來m,每次查詢從m+1開始,這樣就避免了重複查詢乙個位置的情況。ac**如下:
#include
#include
#include
using
namespace std;
string st1;
string st2;
const
int maxn=15;
int ok=0;
struct methodp[maxn]
;string ss1,ss2;
int cnt;
int d;
//迭代加深的深度
void
dfs(
int cur,string st)if(
!ok)
dfs(cur+
1,ss);}
}}intmain()
for(d=
1;d<=
10&&
!ok;d++)if
(!ok) cout<<
"no answer!"
;return0;
}
洛谷P2346 四子連棋 題解 迭代加深搜尋
首先需要注意 題目描述 中說道的這句話 黑白雙方交替走棋,任意一方可以先走 然後我這邊用的是迭代加深搜尋解決的這個問題。我覺得迭代加深搜尋結合了dfs和bfs的優點 能夠像bfs一樣進行層次遍歷 使用回溯,相比bfs將所有狀態都加入佇列,迭代加深搜尋更省空間。示例 include using nam...
洛谷習題P1308 字串搜尋字串
include using namespace std intmain for i 0 i 100000 i for i 0 i 100000 i for i 0 i 100000 i if sum 0 else 問題在於輸入text i 的時候,必須要檢測到100000個輸入項才結束迴圈,所以,得...
洛谷 P1101 單詞方陣(字串 搜尋)
題目 標籤 字串 搜尋 主要思路就是當遇到 y 後,再從八個方向開始搜尋。從某個方向開始搜尋時,如果滿足條件就遞迴,否則結束遞迴。當 yizhong 字串成功搜尋到時,用result陣列儲存路徑,此次dfs也就結束了。注意 用 string 容器儲存時,一定要判斷下標越界問題。include inc...