日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

USACO1.4.2(The clocks)BFS

發布時間:2025/4/5 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 USACO1.4.2(The clocks)BFS 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description

考慮將如此安排在一個 3 x3 行列中的九個時鐘:

目標要找一個最小的移動順序次將所有的指針指向12點。 下面原表格列出了9種不同的旋轉指針的方法,每一種方法都叫一次移動。 選擇1到9號移動方法,將會使在表格中對應的時鐘的指針順時針旋轉90度。 移動方法 受影響的時鐘 1 ABDE 2 ABC 3 BCEF 4 ADG 5 BDEFH 6 CFI 7 DEGH 8 GHI 9 EFHI Example

[但這可能不是正確的方法,請看下面]

Input

第1-3行: 三個空格分開的數字,每個數字表示一個時鐘的初始時間,3,6,9,12。 數字的含意和上面第一個例子一樣。

Output

單獨的一行包括一個用空格分開的將所有指針指向12:00的最短移動順序的列表。 如果有多種方案,輸出那種使的連接起來數字最小的方案。(舉例來說5 2 4 6 < 9 3 1 1)。

Single Input

9 9 12

6 6 6

6 3 6

Single Output

4 5 8 9

自定義? 狀態? 類型,并定義狀態數組,而查找時使用哈希查找表。具體代碼如下:

1 #include<iostream> 2 #include<cstring> 3 #define mem(a) memset(a,0,sizeof(a)); 4 using namespace std; 5 typedef int State[9];//定義“狀態”類型 6 const int MAXN=320000;//定義最大狀態 7 const int MAXSIZE=100003;//哈希表的最大范圍 8 int head[MAXSIZE],fa[MAXN],next[MAXN],move[MAXN];//head為哈希表中的頭結點,next為哈希值相同時組成的鏈表,fa時父節點,move記錄變化時所取的值 9 State st[MAXN];//狀態數組,所有狀態都保存在這里 10 const State goal={3,3,3,3,3,3,3,3,3};//目標狀態,4個時間3,6,9,12依次轉化為0,1,2,3;所以目標狀態是9個3 11 const char mo[9][6]={"abde","abc","bcef","adg","bdefh","cfi","degh","ghi","efhi"};//移動的鐘 12 13 void shuru()//輸入并轉化為0,1,2,3 14 { 15 mem(head);mem(next);//置0 16 int i; 17 for(i=0;i<9;i++){cin>>st[0][i];st[0][i]=st[0][i]/3-1;} 18 } 19 int hash(State& s)//定義哈希函數 20 { 21 int i,a=0; 22 for(i=0;i<9;i++)a=a*10+s[i];//隨便算,比如把幾個數字轉化成9位數 23 return a%MAXSIZE;//確保哈希函數值是不超過表大小的非負正整數 24 } 25 bool insert(int a)//嘗試插入 26 { 27 int h=hash(st[a]); 28 int u=head[h]; 29 while(u)//從表頭開始查找鏈表 30 { 31 if(memcmp(st[u],st[a],sizeof(st[a]))==0)return false;//找到了,插入失敗 32 u=next[u];//順著鏈表繼續查找 33 } 34 next[a]=head[h];//插入到鏈表中 35 head[h]=a; 36 return true; 37 } 38 void print(int p)//打印 39 { 40 if(!fa[p]){cout<<move[p];return ;} 41 print(fa[p]); 42 cout<<" "<<move[p]; 43 } 44 void bfs()//BFS寬搜 45 { 46 int rear=1,front=0; 47 for(;;) 48 { 49 State& s=st[front]; 50 if(memcmp(s,goal,sizeof(goal))==0){print(front);cout<<endl;return ;}//一旦找到就打印并結束搜索 51 int i; 52 for(i=0;i<9;i++)//從1到9依次變化 53 { 54 State& t=st[rear]; 55 memcpy(&t,&s,sizeof(s)); 56 int len=strlen(mo[i]),j; 57 for(j=0;j<len;j++) 58 t[mo[i][j]-'a']=(t[mo[i][j]-'a']+1)%4; 59 if(insert(rear)){move[rear]=i+1;fa[rear++]=front;}//可以插入,記錄并隊列尾加1 60 } 61 front++; 62 } 63 } 64 int main() 65 { 66 shuru(); 67 bfs(); 68 return 0; 69 }

?

轉載于:https://www.cnblogs.com/gj-Acit/archive/2013/02/12/2910277.html

總結

以上是生活随笔為你收集整理的USACO1.4.2(The clocks)BFS的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。