hdu.1430.魔板(bfs + 康托展开)
生活随笔
收集整理的這篇文章主要介紹了
hdu.1430.魔板(bfs + 康托展开)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
魔板
Time Limit: 10000/5000 MS (Java/Others)????Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2170????Accepted Submission(s): 455
1 2 3 4 8 7 6 5
對(duì)于魔板,可施加三種不同的操作,具體操作方法如下:
A: 上下兩行互換,如上圖可變換為狀態(tài)87654321 B: 每行同時(shí)循環(huán)右移一格,如上圖可變換為41236785 C: 中間4個(gè)方塊順時(shí)針旋轉(zhuǎn)一格,如上圖可變換為17245368
給你魔板的初始狀態(tài)與目標(biāo)狀態(tài),請(qǐng)給出由初態(tài)到目態(tài)變換數(shù)最少的變換步驟,若有多種變換方案則取字典序最小的那種。
?
Input 每組測(cè)試數(shù)據(jù)包括兩行,分別代表魔板的初態(tài)與目態(tài)。?
Output 對(duì)每組測(cè)試數(shù)據(jù)輸出滿足題意的變換步驟。?
Sample Input 12345678 17245368 12345678 82754631?
Sample Output C AC 1 #include <iostream> 2 #include <string> 3 #include <algorithm> 4 #include <queue> 5 #include<stdio.h> 6 using namespace std ; 7 const int MAXN = 40321; //由于此題數(shù)字1~8,康托展開的所有情況為8!,共40320種 8 const int fac[8] = {1,1,2,6,24,120,720,5040}; //康托展開中用到的0~7的階乘 9 string ans[MAXN]; //存儲(chǔ)各狀態(tài)的變化步驟,預(yù)處理完成 10 struct node 11 12 { 13 int a[8]; 14 int n; 15 } u,v; 16 void A(node &t) //A操作 17 18 { 19 std::reverse (t.a , t.a + 8) ; 20 21 } 22 void B(node &t) //B操作 23 24 { 25 std::rotate (t.a , t.a + 3, t.a + 4 ) ; 26 std::rotate (t.a + 4 , t.a + 5 , t.a + 8 ) ; 27 } 28 void C(node &t) //C操作 29 30 { 31 std::swap(t.a[1],t.a[6]); 32 std::swap(t.a[6],t.a[5]); 33 std::swap(t.a[5],t.a[2]); 34 35 } 36 int contor(node &t) //康托展開 37 38 { 39 int tmp, num = 0; 40 for(int i=0; i<8; i++) 41 { 42 tmp = 0; 43 for(int j=i+1; j<8; j++) 44 { 45 if(t.a[j] < t.a[i]) 46 { 47 tmp++; 48 49 } 50 51 } 52 num += tmp*fac[7-i]; 53 54 } 55 return num; 56 57 } 58 void Init(void) 59 60 { 61 void (*ptr[3])(node&); //定義函數(shù)指針 62 ptr[0] = A; 63 ptr[1] = B; 64 ptr[2] = C; //指向?qū)?yīng)函數(shù)方便處理 65 66 int mark[MAXN] = {0}; //設(shè)置標(biāo)記 67 mark[0] = 1; 68 69 for(int i=0; i<8; i++) //由初始狀態(tài)12345678開始 70 { 71 u.a[i] = i+1; 72 73 } 74 u.n = contor(u); 75 76 queue<node>que; 77 que.push(u); 78 while(!que.empty()) 79 { 80 u = que.front(); 81 que.pop(); 82 for(int i=0; i<3; i++) //三種變換 83 { 84 v = u; 85 (*ptr[i])(v); 86 v.n = contor(v); //對(duì)副本執(zhí)行操作并康托展開 87 if(mark[v.n] == 0) //重復(fù) 88 { 89 char ch = 'A' + i; 90 ans[v.n] = ans[u.n] + ch; //記錄步驟 91 92 mark[v.n] = 1; //標(biāo)記 93 que.push(v); 94 95 } 96 97 } 98 99 } 100 101 } 102 int main() 103 104 { 105 //freopen ("a.txt" , "r" , stdin ) ; 106 Init(); 107 char a[10] = {0},b[10] = {0}; 108 while(~ scanf ("%s" , a)) 109 { 110 scanf ("%s" , b) ; 111 int n[10]; 112 for(int i=0; i<8; i++) //把初態(tài)置換成12345678 113 { 114 n[a[i] - '0'] = i+1; 115 } 116 117 for(int i=0; i<8; i++) //把目標(biāo)狀態(tài)相對(duì)于初態(tài)置換 118 { 119 u.a[i] = n[b[i] - '0']; 120 121 } 122 123 cout<<ans[contor(u)]<<endl; //輸出由12345678到目標(biāo)態(tài)的步驟 124 125 } 126 return 0; 127 } View Code?
轉(zhuǎn)載于:https://www.cnblogs.com/get-an-AC-everyday/p/4503162.html
總結(jié)
以上是生活随笔為你收集整理的hdu.1430.魔板(bfs + 康托展开)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: xampp 无法启动mysql
- 下一篇: 刷题记录(1)_HDU-1001→101