zoukankan      html  css  js  c++  java
  • POJ3322滚箱子游戏(不错)

    题意:
          讲的是一个游戏,就是在一个平面上滚动一个1*1*2的长方体的游戏,在本题里面的游戏规则是这样的:
    (1)
         一开始给你箱子的状态,可能是横着也可能是竖着。
    (2)
         每一次可以滚动箱子,但是每次滚动到的位置(1个或者2个)都必须不能是空的。
    (3)
         有的位置只能经得起箱子一半的重量,有的能经得起真个箱子的重量,经得起一半的格子意思就是不能在当前的这个格子上吧箱子竖起来。
    (4)然后问从起始状态到掉到终点给的洞里面的最小步数,掉到洞里面的时候必须是竖直掉下去的。





    思路:
          比较明显可以用搜索来做,但是这个题目的关键点是如何标记状态,我的做法是对于每一个点都有五个状态,就是另一个点相对于这个点的位置,可以是东南西北,还有正上方
    ,标记的时候是这样的依靠五个状态,搜索的时候为了简化代码我写的是3个状态的,因为有一些等效状态,我们只要搜索其中的一个就行了,但是如果你愿意把所有的状态都写出来,那么一共是5种,每种有四个方向的走法一共是5*4种选择,这样代码量估计比较大,如果是相等状态只进一个的话可以达到3*4种选择,但是这样的话要注意就是在mark的时候的一些细节,别的没啥的就是简单广搜,姿势好点应该没啥大问题,具体细节可以看下面代码。


    #include<queue>
    #include<stdio.h>
    #include<string.h>


    using namespace std;


    typedef struct
    {
        int x ,y ,t ,k;
    }NODE;


    NODE xin ,tou;
    int map[505][505] ,n ,m;
    int mark[505][505][5];
    int ex ,ey;


    bool ok(int x ,int y ,int k)
    {
        return x >= 1 && x <= n && y >= 1 && y <= m && map[x][y] && !mark[x][y][k];
    }


    int BFS()
    {
        queue<NODE>q;
        q.push(xin);
        memset(mark ,0 ,sizeof(mark));
        mark[xin.x][xin.y][xin.k] = 1;
        NODE X1 ,X2;
        while(!q.empty())
        {
            tou = q.front();
            q.pop();
            //printf("%d %d %d %d** " ,tou.x ,tou.y ,tou.k ,tou.t);
            if(!tou.k && tou.x == ex && tou.y == ey)
            return tou.t;
            if(tou.k == 0)
            {
                //上
                X1.x = tou.x - 1 ,X1.y = tou.y ,X1.k = 1;
                X2.x = tou.x - 2 ,X2.y = tou.y ,X2.k = 3;
                if(ok(X1.x ,X1.y ,X1.k) && ok(X2.x ,X2.y ,X2.k))
                {
                    mark[X1.x][X1.y][X1.k] = mark[X2.x][X2.y][X2.k] = 1;
                    X1.t = tou.t + 1;
                    q.push(X1);
                }


                //下
                X1.x = tou.x + 1 ,X1.y = tou.y ,X1.k = 3;
                X2.x = tou.x + 2 ,X2.y = tou.y ,X2.k = 1;
                if(ok(X1.x ,X1.y ,X1.k) && ok(X2.x ,X2.y ,X2.k))
                {
                    mark[X1.x][X1.y][X1.k] = mark[X2.x][X2.y][X2.k] = 1;
                    X2.t = tou.t + 1;
                    q.push(X2);
                }


                //左
                X1.x = tou.x ,X1.y = tou.y - 1 ,X1.k = 4;
                X2.x = tou.x ,X2.y = tou.y - 2 ,X2.k = 2;
                if(ok(X1.x ,X1.y ,X1.k) && ok(X2.x ,X2.y ,X2.k))
                {
                    mark[X1.x][X1.y][X1.k] = mark[X2.x][X2.y][X2.k] = 1;
                    X1.t = tou.t + 1;
                    q.push(X1);
                }


                //右
                X1.x = tou.x ,X1.y = tou.y + 1 ,X1.k = 2;
                X2.x = tou.x ,X2.y = tou.y + 2 ,X2.k = 4;
                if(ok(X1.x ,X1.y ,X1.k) && ok(X2.x ,X2.y ,X2.k))
                {
                    mark[X1.x][X1.y][X1.k] = mark[X2.x][X2.y][X2.k] = 1;
                    X2.t = tou.t + 1;
                    q.push(X2);
                }


            }
            else if(tou.k == 1)
            {
                //上
                X1.x = tou.x - 2 ,X1.y = tou.y ,X1.k = 0;
                if(ok(X1.x ,X1.y ,X1.k) && map[X1.x][X1.y] == 1)
                {
                    X1.t = tou.t + 1;
                    mark[X1.x][X1.y][X1.k] = 1;
                    q.push(X1);
                }


                //下
                X1.x = tou.x + 1 ,X1.y = tou.y ,X1.k = 0;
                if(ok(X1.x ,X1.y ,X1.k) && map[X1.x][X1.y] == 1)
                {
                    X1.t = tou.t + 1;
                    mark[X1.x][X1.y][X1.k] = 1;
                    q.push(X1);
                }


                //左
                X1.x = tou.x ,X1.y = tou.y - 1 ,X1.k = 1;
                X2.x = tou.x - 1 ,X2.y = tou.y - 1 ,X2.k = 3;
                if(ok(X1.x ,X1.y ,X1.k) && ok(X2.x ,X2.y ,X2.k))
                {
                    mark[X1.x][X1.y][X1.k] = mark[X2.x][X2.y][X2.k] = 1;
                    X1.t = tou.t + 1;
                    q.push(X1);
                }


                //右
                X1.x = tou.x ,X1.y = tou.y + 1 ,X1.k = 1;
                X2.x = tou.x - 1 ,X2.y = tou.y + 1 ,X2.k = 3;
                if(ok(X1.x ,X1.y ,X1.k) && ok(X2.x ,X2.y ,X2.k))
                {
                    mark[X1.x][X1.y][X1.k] = mark[X2.x][X2.y][X2.k] = 1;
                    X1.t = tou.t + 1;
                    q.push(X1);
                }


            }
            else if(tou.k == 4)
            {
                //上
                X1.x = tou.x - 1 ,X1.y = tou.y ,X1.k = 4;
                X2.x = tou.x - 1 ,X2.y = tou.y - 1 ,X2.k = 2;
                if(ok(X1.x ,X1.y ,X1.k) && ok(X2.x ,X2.y ,X2.k))
                {
                    mark[X1.x][X1.y][X1.k] = mark[X2.x][X2.y][X2.k] = 1;
                    X1.t = tou.t + 1;
                    q.push(X1);
                }
                //下
                X1.x = tou.x + 1 ,X1.y = tou.y ,X1.k = 4;
                X2.x = tou.x + 1 ,X2.y = tou.y - 1 ,X2.k = 2;
                if(ok(X1.x ,X1.y ,X1.k) && ok(X2.x ,X2.y ,X2.k))
                {
                    mark[X1.x][X1.y][X1.k] = mark[X2.x][X2.y][X2.k] = 1;
                    X1.t = tou.t + 1;
                    q.push(X1);
                }
                //左
                X1.x = tou.x ,X1.y = tou.y - 2 ,X1.k = 0;
                if(ok(X1.x ,X1.y ,X1.k) && map[X1.x][X1.y] == 1)
                {
                    X1.t = tou.t + 1;
                    mark[X1.x][X1.y][X1.k] = 1;
                    q.push(X1);
                }


                //右
                X1.x = tou.x ,X1.y = tou.y + 1 ,X1.k = 0;
                if(ok(X1.x ,X1.y ,X1.k) && map[X1.x][X1.y] == 1)
                {
                    X1.t = tou.t + 1;
                    mark[X1.x][X1.y][X1.k] = 1;
                    q.push(X1);
                }


            }
        }
        return -1;
    }


    int main ()
    {
        char str[505];
        int sx1 ,sx2 ,sy1 ,sy2 ,s;
        while(~scanf("%d %d" ,&n ,&m) && n + m)
        {
            s = 0;
            for(int i = 1 ;i <= n ;i ++)
            {
                scanf("%s" ,str);
                for(int j = 1 ;j <= m ;j ++)
                {
                    if(str[j-1] == 'X')
                    {
                        s ++;
                        if(s == 1) sx1 = i ,sy1 = j;
                        else sx2 = i ,sy2 = j;
                        map[i][j] = 1;
                    }
                    else if(str[j-1] == 'O')
                    {
                        ex = i ,ey = j;
                        map[i][j] = 1;
                    }
                    else if(str[j-1] == 'E') map[i][j] = 2;
                    else if(str[j-1] == '#') map[i][j] = 0;
                    else map[i][j] = 1;
                }
            }
            if(s == 1) xin.x = sx1 ,xin.y = sy1 ,xin.k = 0 ,xin.t = 0;
            else
            {
                if(sx1 == sx2) xin.x = sx2 ,xin.y = sy2 ,xin.k = 4 ,xin.t = 0;
                else xin.x = xin.x = sx2 ,xin.y = sy2 ,xin.k = 1 ,xin.t = 0;
            }
            int ans = BFS();
            ans == -1 ? printf("Impossible ") : printf("%d " ,ans);
        }
        return 0;
    }













  • 相关阅读:
    js点击改变元素标签的样式JQ,动态加减class样式
    设置OFFICE默认比例,不分成两栏
    如何更改win7任务管理器的背景。ctrl+alt+delete调出来的界面的背景
    SQLServer 查询分析器里大小写转换快捷键
    SQL Server查询分析器里语句执行事务控制,防止增删改错
    JS生成二维码,文字,URL生成动态二维码,并在GridView里动态调用
    GridView动态绑定字段做参数,动态调用JS传参-JS
    sql server分页语句原始语句
    SQL 查询--日期条件(今日、昨日、本周、本月)
    将UIWebView显示的内容转为图片和PDF
  • 原文地址:https://www.cnblogs.com/csnd/p/12062532.html
Copyright © 2011-2022 走看看