簡單搜尋
阿新 • • 發佈:2020-07-26
自從打了兩天的比賽,自閉了,現在只能看看搜尋,重新刷題了。
希望自己能在演算法這個方面越走越遠吧
一道簡單的搜尋題,(因為太累了,肝不動了,就水這個簡單題吧)
題目的意思是:
如下面第一個圖的九宮格中,放著 1~8 的數字卡片,還有一個格子空著。與空格子相鄰的格子中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。
我們把第一個圖的局面記為:12345678.
把第二個圖的局面記為:123.46758
顯然是按從上到下,從左到右的順序記錄數字,空格記為句點。
本題目的任務是已知九宮的初態和終態,求最少經過多少步的移動可以到達。如果無論多少步都無法到達,則輸出-1。
分析:
這個題就是一道簡單bfs搜尋題
注意座標變換一下就行了
1 #include <iostream> 2 #include <queue> 3 #include <map> 4 using namespace std; 5 6 map<string,bool> mp; 7 int dx[4]={-1,0,1,0}; 8 int dy[4]={0,1,0,-1}; 9 10 void swap(string& s,int pos1,int pos2){ 11 char tem=s[pos1]; 12 s[pos1]=s[pos2];13 s[pos2]=tem; 14 } 15 16 int main(){ 17 string s1,s2; 18 cin>>s1; 19 cin>>s2; 20 int posd; 21 for(int i=0;i<s1.size();i++){ 22 if(s1[i]=='.'){ 23 posd=i; 24 } 25 } 26 mp[s1]=true; 27 queue<pair<pair<string,int>,int> > q; 28 q.push(make_pair(make_pair(s1,posd),0)); 29 int stp=-1; 30 while(q.size()){ 31 pair<pair<string,int>,int> t=q.front(); 32 q.pop(); 33 string nows=t.first.first; 34 int x=t.first.second/3; 35 int y=t.first.second%3; 36 if(nows==s2){ 37 stp=t.second; 38 break; 39 } 40 for(int i=0;i<4;i++){ 41 int xd=x+dx[i]; 42 int yd=y+dy[i]; 43 string nexs=nows; 44 if(xd>=0&&xd<3&&yd>=0&&yd<3){ 45 swap(nexs,t.first.second,xd*3+yd); 46 if(mp[nexs]){ 47 continue; 48 } 49 q.push(make_pair(make_pair(nexs,xd*3+yd),t.second+1)); 50 mp[nexs]=true; 51 } 52 } 53 } 54 cout<<stp<<endl; 55 }
程式碼也好寫,就不多說了,我好菜啊啊啊啊啊啊啊啊啊啊!