首页 > 代码库 > hdu-5012-Xi'an网络赛-1006-水bfs

hdu-5012-Xi'an网络赛-1006-水bfs

题意略。

思路:简单的四方向BFS,用map记录去重。

总结:WA了一发因为骰子面的变换写错了一个地方。要细心。

AC代码(Exe.Time: 31ms):

  1 #include <iostream>  2 #include <cstdio>  3 #include <vector>  4 #include <algorithm>  5 #include <map>  6 #include <queue>  7 using namespace std;  8   9 struct node 10 { 11     int up, dn, l, r, fr, bk; 12     int num; 13     bool operator == (const node x) const 14     { 15         bool re =  (up == x.up && dn == x.dn && l == x.l && r == x.r && fr == x.fr && bk == x.bk); 16         return re; 17     } 18     bool operator < (const node x) const 19     { 20         if(up == x.up) { 21             if(dn == x.dn) { 22                 if(l == x.l) { 23                     if(r == x.r) { 24                         return fr < x.fr; 25                     } 26                     return r < x.r; 27                 } 28                 return l < x.l; 29             } 30             return dn < x.dn; 31         } 32         return up < x.up; 33     } 34 }; 35 void Swap(int &a, int &b) 36 { 37     a = a^b; 38     b = a^b; 39     a = a^b; 40 } 41 node arr, brr; 42 void change_lr(node &x) 43 { 44     Swap(x.l, x.dn); 45     Swap(x.r, x.up); 46     Swap(x.l, x.r); 47 } 48 void change_rr(node &x) 49 { 50     Swap(x.up, x.r); 51     Swap(x.dn, x.l); 52     Swap(x.up, x.dn); 53 } 54 void change_br(node &x) 55 { 56     Swap(x.up, x.fr); 57     Swap(x.dn, x.bk); 58     Swap(x.fr, x.bk); 59 } 60 void change_fr(node &x) 61 { 62     Swap(x.up, x.fr); 63     Swap(x.dn, x.bk); 64     Swap(x.dn, x.up); 65 } 66 void print(node x) 67 { 68     cout<<x.up<<" "<<x.dn<<" "<<x.l<<" "<<x.r<<" "<<x.fr<<" "<<x.bk<<endl; 69 } 70 void bfs(node cont, int &num) 71 { 72     int cnt = 0; 73     queue<node> q; 74     map<node, int> vis; 75     map<node, int>::iterator it; 76     vis.insert(pair<node, int> (cont, cnt++)); 77     q.push(cont); 78     while(!q.empty()) { 79         node fro = q.front(); q.pop(); 80         if(fro == brr) { num = fro.num; return; } 81         node x; 82         for(int i = 0; i < 4; i++ ){ 83             x = fro; 84             x.num = fro.num+1; 85             if(i == 0) change_br(x); 86             else if(i == 1) change_fr(x); 87             else if(i == 2) change_lr(x); 88             else if(i == 3) change_rr(x); 89             it = vis.find(x); 90             if(it == vis.end()) { 91                 vis.insert(pair<node, int> (x, cnt++)); 92                 q.push(x); 93             } 94         } 95     } 96     num = -1; 97 } 98  99 int main()100 {101     node a;102     while(scanf("%d%d%d%d%d%d", &a.up, &a.dn, &a.l, &a.r, &a.fr, &a.bk) != EOF) {103         a.num = 0;104         arr = a;105         scanf("%d%d%d%d%d%d", &a.up, &a.dn, &a.l, &a.r, &a.fr, &a.bk);106         brr = a;107         int ans;108         bfs(arr, ans);109         printf("%d\n", ans);110     }111 }
View Code

 

hdu-5012-Xi'an网络赛-1006-水bfs