2014 网选 5012 Dice(bfs模板)

/*
    题意:就是给定两个筛子,每个筛子上6个面,每个面的数字属于[1,6], 且互不相同!
    问a筛子最少经过按照题目规定的要求转动,达到和b筛子上下左右前后的数字相同!

    思路:很直白的bfs,将每一种状态对应一个数字,保证这种状态不会重新加入队列中!
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;

int a[7], ss;
int vis[654330];

struct node{
    int k[7];
    node(){}
    node(int a1, int a2, int a3, int a4, int a5, int a6){
        k[1]=a1;
        k[2]=a2;
        k[3]=a3;
        k[4]=a4;
        k[5]=a5;
        k[6]=a6;
    }
    int step;
};

queue<node>q; 

int sum(node x){
    int s=0;
    for(int i=1; i<=6; ++i)
       s= s*10 + x.k[i];
    return s;
}

bool bfs(){
    while(!q.empty()) q.pop();
    node cur(a[1], a[2], a[3], a[4], a[5], a[6]);
    cur.step=0;
    q.push(cur);
    vis[sum(cur)]=1;
    while(!q.empty()){
        cur = q.front();
        if(sum(cur)==ss){
            printf("%d\n", cur.step);
            return true;
        }
        q.pop();
        node *nt = new node(cur.k[5], cur.k[6], cur.k[3], cur.k[4], cur.k[2], cur.k[1]);
        int v = sum(*nt);
        if(!vis[v]){
            vis[v]=1;
            nt->step = cur.step + 1;
            q.push(*nt);
        }

        nt = new node(cur.k[6], cur.k[5], cur.k[3], cur.k[4], cur.k[1], cur.k[2]);
        v = sum(*nt);
        if(!vis[v]){
            vis[v]=1;
            nt->step = cur.step + 1;
            q.push(*nt);
        }

        nt = new node(cur.k[3], cur.k[4], cur.k[2], cur.k[1], cur.k[5], cur.k[6]);
        v = sum(*nt);
        if(!vis[v]){
            vis[v]=1;
            nt->step = cur.step + 1;
            q.push(*nt);
        }

        nt = new node(cur.k[4], cur.k[3], cur.k[1], cur.k[2], cur.k[5], cur.k[6]);
        v = sum(*nt);
        if(!vis[v]){
            vis[v]=1;
            nt->step = cur.step + 1;
            q.push(*nt);
        }
    }
    return false;
}

int main(){
    while(scanf("%d%d%d%d%d%d", &a[1], &a[2], &a[3], &a[4], &a[5], &a[6])!=EOF){
        ss=0;
        for(int i=1; i<=6; ++i){
            int x;
            scanf("%d", &x);
            ss = ss * 10 + x;
        }
        memset(vis, 0, sizeof(vis));
        if(!bfs())
            printf("-1\n");
    }
    return 0;
}
时间: 2025-01-02 07:52:47

2014 网选 5012 Dice(bfs模板)的相关文章

2014 网选 广州赛区 hdu 5025 Saving Tang Monk(bfs+四维数组记录状态)

/* 这是我做过的一道新类型的搜索题!从来没想过用四维数组记录状态! 以前做过的都是用二维的!自己的四维还是太狭隘了..... 题意:悟空救师傅 ! 在救师父之前要先把所有的钥匙找到! 每种钥匙有 k 种, 每一种有多个! 只要求找到每一种的其中一个就可以! 找钥匙的顺序按照 第1种, 第2种, 第3种 ....第k种! 找钥匙的时间是一步, 走到相邻空地的时间是一步, 打蛇的时间就是两步! 求找到师傅的最少步数! 这里说一下 state[N][N][10][35]表示的含义: ->state[

2014 网选 5024 Wang Xifeng&#039;s Little Plot

题意:从任意一个任意一个可走的点开始找一个最长的路,这条路如果有转弯的话,那么必须是 90度,或者没有转弯! 思路: 首先用dfs将所有可走点开始的 8 个方向上的线段的最长长度求出来 !step[i][j][k] 表示的是(i,j)沿着k方向一直走到头或者转弯时的最长步数!最后枚举每一个可走点转弯为90度的路径,找到最长的长度! step[i][j][k1] + step[i][j][k2] 就是 (i, j)这个点 k1 和 k2方向构成90度! #include<iostream> #i

2014 网选 5014 Number Sequence(异或)

/* 题意:a, b两个序列,规定由[0, n]区间的数! 求 a[i] ^ b[i] 的和最大! 思路:如果数字 n的二进制有x位, 那么一定存在一个数字m,使得n^m的所有二进制位 都是1,也就是由x位1!这样下去的到的值就是最大值! */ #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define N 100005 using namespace s

2014 网选 上海赛区 hdu 5047 Sawtooth

题意:求n个'M'型的折线将一个平面分成的最多的面数!思路:我们都知道n条直线将一个平面分成的最多平面数是 An = An-1 + n+1也就是f(n) = (n*n + n +2)/2对于一个'M'型的折线呢?它有四条线,但是由于三个顶点的关系导致划分的平面的数目减少了9个!所以有递推公式 f(n) = (m*m + m + 2)/2 - 9*n; m = 4*n 最后 f(n) = (8*n+1)*(n-1)+2) 由于 n<=1e12 , 所以回报 long long!那么对于大于1e9的

2014 网选 广州赛区 hdu 5023 A Corrupt Mayor&#039;s Performance Art

#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define N 1000005 using namespace std; int c[35]; int tree[N*4];//正值表示该节点所管理的区间的颜色是纯色,-1表示的是非纯色 int n, m; void buildT(int ld, int rd, int p){ if(ld <= rd)

2014 网选 5011 Game(Nim游戏,数学题)

/* 题意:Nim游戏! 思路:通过异或,判断将n个数表示成二进制的形式之后,是否对应位的数字1 的个数是偶数! */ #include<iostream> using namespace std; int main(){ int n, x, s; while(cin>>n){ s=0; while(n--){ cin>>x; s^=x; } if(s) cout<<"Win";//不是偶数 else cout<<"

BFS 模板 【迷宫的最短路径】

#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <vector> #include <queue> #include <algorithm> #include <set> #include <stack> using namespac

网易云音乐发布2014年度中国移动音乐用户行为报告

日前,网易云音乐对全国音乐软件用户进行了详尽调查,通过海量数据分析得出<2014中国人移动音乐用户行为报告>.该报告主要对中国移动音乐用户行为进行分析,研究各种因素对移动音乐用户行为产生的影响,移动音乐软件内容特点及行业发展.期望为市场各方面提供参考.报告显示,移动音乐用户与收入有关,不同收入人群对音乐软件选择有较大差异:2014年,移动音乐用户最多的行为除听歌外,分享单曲.歌词以及音乐评论等社交行为较前一年有数倍增长.提升显著.第一部分:用户年龄.性别.收入等基本属性85后占移动音乐听众主流

如何设置WPS2005专业版的默认模板

与WORD2003一样WPS2005中金山文字的默认模板是A4纸.上下页边距为25.4毫米,左右边距为31.7毫米,页眉页脚为空(如图1)且默认的文字格式为五号宋体字,首先不缩进.这样的设置虽然标准,但并不符合单位对公文的要求,我们的要求是:16开纸,上下页边距为25毫米,左右页边距为20毫米,在页脚中间插入页号,默认字体为三号仿宋,首先缩进2个字符.每次新建文档,都要这样重复地设置一番,不仅浪费宝贵的时间,也使工作的乐趣消失殆尽. 图1 那么,如何让我们自己设置好的页面设置成为系统的默认设置呢