zoukankan      html  css  js  c++  java
  • 转盘游戏[XDU1006]

    Problem 1006 - 转盘游戏
    Time Limit: 1000MS   Memory Limit: 65536KB   Difficulty:
    Total Submit: 87  Accepted: 42  Special Judge: No
    Description

      wm最近喜欢上一种无聊的转盘解锁游戏,他每天都会为这游戏消磨上三个小时的时间。这游戏由三个正六边形拼成,拼成后一共有13个点,其中有4个黑点和9个白点,如下图。每一步可以顺时针或逆时针转动三个六边形的任意一个60度,转动时六边形的顶点也会相应转动,而这游戏的目的是把四个黑点都转到中间(图中最后一个状态)。这是一个很简单的游戏,想达到游戏目的并不难,但wm觉得这样没挑战性,他决定对于任意一个初始状态,用最少的步数去玩这个游戏。

    Input
      输入包含多组数据(500组),EOF结束。
      每组数据都只有一行13个字符的01串,以从上到下,从左到右的点的顺序表示初始状态(这个由三个正六边形拼成图形最上面一排两个点编号为1 2,第二排三个点编号为3 4 5,依此类推,最后一个点编号为13。第一组样例为上图的初始状态),其中1表示黑点0表示白点。
    Output
      每组数据输出一行,解出游戏需要的最小步数。
    Sample Input
    0000000101011
    1011000001000
    Sample Output
    3
    2
    Hint
     
    Source
    2010.04内部测试赛
    #include<stdio.h>
    #include<string.h>
    #include<queue>
    using namespace std;
    struct node
    {
        int step;
        int state[14];
    };
    int shift[3][6]={{1,4,7,9,6,3},{2,5,8,10,7,4},{7,10,12,13,11,9}};
    char str[20];
    bool f[5000];
    int encode(node x)
    {
        int i,ans=0;
        for (i=1;i<=13;i++) ans=ans*2+x.state[i];
        return ans;
    }
    bool finish(node x)
    {
        if (x.state[4]==0) return false;
        if (x.state[7]==0) return false;
        if (x.state[9]==0) return false;
        if (x.state[10]==0) return false;
        return true;
    }
    int bfs()
    {
        queue<node> q;
        while (!q.empty()) q.pop();
        memset(f,false,sizeof(f));
        node s,tmp;
        int i,j,t;
        for (i=1;i<=13;i++) s.state[i]=str[i]-48;
        s.step=0;
        q.push(s);
        f[encode(s)]=true;
        while (!q.empty())
        {
            s=q.front();
            q.pop();
            if (finish(s)) return s.step;
            for (i=0;i<3;i++)
            {
                tmp=s;
                for (j=0;j<6;j++) tmp.state[shift[i][(j+1)%6]]=s.state[shift[i][j]];
                tmp.step++;
                t=encode(tmp);
                if (!f[t])
                {
                    f[t]=true;
                    q.push(tmp);
                }
                    //shift[i][(j+1)%6]<-shift[i][j]
                tmp=s;
                for (j=0;j<6;j++) tmp.state[shift[i][(j+5)%6]]=s.state[shift[i][j]];
                tmp.step++;
                t=encode(tmp);
                if (!f[t])
                {
                    f[t]=true;
                    q.push(tmp);
                }
                    //shift[i][j]->shift[i][(j+5)%6]
            }
        }
        return -1;
    }
    int main()
    {
        while (scanf("%s",&str[1])!=EOF)
        {
            scanf("%s",&str[1]);
            int ans=bfs();
            printf("%d
    ",ans);
        }
        return 0;
    }

     

  • 相关阅读:
    vscode 编写调试autojs
    auto打印调试
    AutoJS 初级操作代码
    转 【海豚教程】用Visual Studio开发安卓应用
    转 android sdk创建AVD时如何更改AVD的存储路径
    安装 Mono for Android for Visual Studio 2010
    转 C# ToolStrip浮动及上/下/左/右 停靠
    关于t328w root后哪些能删除哪些不能删除
    Windows 7 添加 loopback adapter
    如何在vs中创建安装程序
  • 原文地址:https://www.cnblogs.com/dramstadt/p/3262488.html
Copyright © 2011-2022 走看看