zoukankan      html  css  js  c++  java
  • UVA-810 A Dicey Problem (BFS)

    题目大意:滚骰子游戏,骰子的上面的点数跟方格中的数相同时或格子中的数是-1时能把格子滚过去,找一条从起点滚到起点的路径。

    题目大意:简单BFS,状态转移时细心一些即可。

    代码如下;

    # include<iostream>
    # include<cstdio>
    # include<map>
    # include<string>
    # include<queue>
    # include<cstring>
    # include<algorithm>
    using namespace std;
    
    struct Node
    {
        int x,y,s,t;
        string px,py;
        Node(int _x,int _y,int _s,int _t,string _px,string _py):x(_x),y(_y),s(_s),t(_t),px(_px),py(_py){}
        bool operator < (const Node &a) const {
            return t>a.t;
        }
    };
    int Left[50],Right[50],vis[10][10][50],mp[10][10],r,c;
    int behind[6]={6,5,4,3,2,1};
    int d[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
    string name;
    
    void init()
    {
        Left[9]=4,Right[9]=3;
        Left[12]=3,Right[12]=4;
        Left[10]=2,Right[10]=5;
        Left[11]=5,Right[11]=2;
    
        Left[15]=3,Right[15]=4;
        Left[20]=4,Right[20]=3;
        Left[18]=1,Right[18]=6;
        Left[17]=6,Right[17]=1;
    
        Left[22]=5,Right[22]=2;
        Left[27]=2,Right[27]=5;
        Left[23]=1,Right[23]=6;
        Left[26]=6,Right[26]=1;
    
        Left[29]=2,Right[29]=5;
        Left[34]=5,Right[34]=2;
        Left[30]=6,Right[30]=1;
        Left[33]=1,Right[33]=6;
    
        Left[36]=4,Right[36]=3;
        Left[41]=3,Right[41]=4;
        Left[38]=1,Right[38]=6;
        Left[39]=6,Right[39]=1;
    
        Left[44]=3,Right[44]=4;
        Left[47]=4,Right[47]=3;
        Left[46]=2,Right[46]=5;
        Left[45]=5,Right[45]=2;
    }
    
    bool ok(int x,int y)
    {
        return x>=0&&x<r&&y>=0&&y<c;
    }
    
    void bfs(int sx,int sy,int ss)
    {
        priority_queue<Node>q;
        memset(vis,0,sizeof(vis));
        string path="";
        q.push(Node(sx,sy,ss,0,path+(char)(sx+'A'),path+(char)(sy+'A')));
        while(!q.empty())
        {
            Node u=q.top();
            q.pop();
    
            if(u.t&&u.x==sx&&u.y==sy){
                int l=u.px.size();
                for(int i=0;i<l;++i){
                    if(i==0)
                        printf("  ");
                    printf("(%d,%d)",u.px[i]-'A'+1,u.py[i]-'A'+1);
                    if(i==l-1)
                        printf("
    ");
                    else if(i%9==8)
                        printf(",
      ");
                    else
                        printf(",");
                }
                return ;
            }
    
            int dd[4]={u.s%7,behind[u.s%7-1],Right[u.s],Left[u.s]};
            for(int i=0;i<4;++i){
                int nx=u.x+d[i][0],ny=u.y+d[i][1];
                if(ok(nx,ny)&&(mp[nx][ny]==(u.s/7)||mp[nx][ny]==-1)){
                    int k=u.s%7;
                    if(i==0)
                        k=behind[u.s/7-1];
                    if(i==1)
                        k=u.s/7;
                    if(!vis[nx][ny][dd[i]*7+k]){
                        vis[nx][ny][dd[i]*7+k]=1;
                        q.push(Node(nx,ny,dd[i]*7+k,u.t+1,u.px+(char)(nx+'A'),u.py+(char)(ny+'A')));
                    }
                }
            }
        }
        printf("  No Solution Possible
    ");
    }
    
    int main()
    {
        //freopen("UVA-810 A Dicey Problem.txt","r",stdin);
        int sx,sy,st,sf;
        init();
        while(cin>>name)
        {
            if(name=="END")
                break;
            scanf("%d%d%d%d%d%d",&r,&c,&sx,&sy,&st,&sf);
            for(int i=0;i<r;++i)
                for(int j=0;j<c;++j)
                    scanf("%d",&mp[i][j]);
            cout<<name<<endl;
            bfs(sx-1,sy-1,st*7+sf);
        }
        return 0;
    }
    

      

  • 相关阅读:
    C#网络编程TCP通信实例程序简单设计
    C#网络编程TCP通信实例程序简单设计
    2329: 密码破解【数组】
    纸牌游戏小猫钓鱼
    认识栈
    认识队列
    2754: C++习题快速排序
    3047: 快速排序算法
    Problem A: C语言习题 链表建立,插入,删除,输出
    Problem C: 动态规划基础题目之数字三角形
  • 原文地址:https://www.cnblogs.com/20143605--pcx/p/4863560.html
Copyright © 2011-2022 走看看