1. 程式人生 > 實用技巧 >簡單搜尋

簡單搜尋

自從打了兩天的比賽,自閉了,現在只能看看搜尋,重新刷題了。

希望自己能在演算法這個方面越走越遠吧

一道簡單的搜尋題,(因為太累了,肝不動了,就水這個簡單題吧)

題目的意思是:

如下面第一個圖的九宮格中,放著 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 }

程式碼也好寫,就不多說了,我好菜啊啊啊啊啊啊啊啊啊啊!