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 }

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

时间: 2024-11-03 05:42:52

hdu-5012-Xi'an网络赛-1006-水bfs的相关文章

hdu 4405 概率dp 2012年金华亚洲网络赛--虽然水,但是是自己独立做的第一道概率dp

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4405 e[i]:当前在位置i还需要走的步数期望 受刘汝佳的AC自动机那个后缀链接写法的启发,我的x[i]通过逆序算出来连续有"flight line "的时候,能到达的最远距离, rep(i,0,m) { scanf("%d%d",&xx,&yy); x[xx]=yy; } for(int i=n;i>=0;i--) if(x[i]!=-1 &

大连网络赛 1006 Football Games

1 //大连网络赛 1006 2 // 吐槽:数据比较水.下面代码可以AC 3 // 但是正解好像是:排序后,前i项的和大于等于i*(i-1) 4 5 #include <bits/stdc++.h> 6 using namespace std; 7 #define LL long long 8 typedef pair<int,int> pii; 9 const double inf = 123456789012345.0; 10 const LL MOD =100000000L

HDU 5024 (广州网络赛) Wang Xifeng&#39;s Little Plot 记忆化搜索+枚举

Problem Description <Dream of the Red Chamber>(also <The Story of the Stone>) is one of the Four Great Classical Novels of Chinese literature, and it is commonly regarded as the best one. This novel was created in Qing Dynasty, by Cao Xueqin.

HDU 6205 2017沈阳网络赛 思维题

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6205 题意:给你n堆牌,原本每一堆的所有牌(a[i]张)默认向下,每次从第一堆开始,将固定个数的牌(b[i]张)翻上,然后下一堆继续,直到没有足够的牌翻上,然后你可以获得当前已经操作过的堆的所有牌.最初你可以调整堆的顺序,把第一堆放到最后一堆(逆时针旋转),你可以重复这个操作,问你要重复多少次这个操作,才能获得最多的牌. 解法:先把这个序列复制一遍放在原来的序列后面.当i=n的时候结束就可以了,每次

HDU 6200 2017沈阳网络赛 树上区间更新,求和

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6200 题意:给个图,有2种操作,一种是加一条无向边,二是查询u,v之间必须有的边的条数,所谓必须有的边就是对于u,v必须通过这条边才能到达. 解法:一个很简单的想法,搞出图上的一颗树,然后剩下的边当成询问点队加到更新点集,每加入一个更新点对,直接把u,v区间的值置为0即可,查询就直接区间求和,可以直接树剖来维护,简单暴力,读入挂卡过.还有1个log的做法,可以用LCT维护(这个没写,口胡的) #in

HDU 6198 2017沈阳网络赛 线形递推

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6198 题意:给出一个数k,问用k个斐波那契数相加,得不到的数最小是几. 解法:先暴力打表看看有没有规律. #include <bits/stdc++.h> using namespace std; int dp[2000][2000]; typedef long long LL; int main() { LL c[50]; c[0]=0; c[1]=1; c[2]=1; for(int i=2;

HDU 6201 2017沈阳网络赛 树形DP或者SPFA最长路

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6201 题意:给出一棵树,每个点有一个权值,代表商品的售价,树上每一条边上也有一个权值,代表从这条边经过所需要的花费.现在需要你在树上选择两个点,一个作为买入商品的点,一个作为卖出商品的点,当然需要考虑从买入点到卖出点经过边的花费.使得收益最大.允许买入点和卖出点重合,即收益最小值为0. 解法:我们设1为根节点,假设一开始一个人身上的钱为0.我们设dp[i][0]表示从根节点走到i及其子树并中任一点买

hdu 5446(2015长春网络赛J题 Lucas定理+中国剩余定理)

题意:M=p1*p2*...pk:求C(n,m)%M,pi小于10^5,n,m,M都是小于10^18. pi为质数 M不一定是质数 所以只能用Lucas定理求k次 C(n,m)%Pi最后会得到一个同余方程组x≡B[0](mod p[0])x≡B[1](mod p[1])x≡B[2](mod p[2])......解这个同余方程组 用中国剩余定理 Sample Input19 5 23 5 Sample Output6 1 # include <iostream> 2 # include <

hdu5442(2015长春赛区网络赛1006)后缀数组+KMP /最小表示法?

题意:给定一个由小写字母组成的长度为 n 的字符串,首尾相连,可以从任意一个字符开始,顺时针或逆时针取这个串(长度为 n),求一个字典序最大的字符串的开始字符位置和顺时针或逆时针.如果有多个字典序最大的字符串,优先选择开始位置靠前的,如果开始位置相同,优先选择顺时针. 这种字符串的问题,第一反应是后缀数组,为了达到首尾相连的目的,所以先复制了一个两倍长的该字符串,然后再将串倒置,也弄成两倍长度,得到顺逆时针的两倍长的串,并对这两个字符串分别做后缀数组,得到 sa 数组(该串字典序第几小的后缀的开

hdu 4068 福州赛区网络赛A 数学 ***

a1/sum 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 const int INF=0x3f3f3