USACO1.4.2(The clocks)BFS
生活随笔
收集整理的這篇文章主要介紹了
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于 UDP Hole Punching
- 下一篇: 科技博客