zoukankan      html  css  js  c++  java
  • 1373. 两只奶牛

    状态可表示成(6)元祖的形式:

    [(x_{cow},y_{cow},direction_{cow},x_{farmer},y_{farmer},direction_{farmer}) ]

    由于每个状态每轮只会扩展出一个状态(即只有一种决策),就不需要借助队列来进行(BFS)了。

    const int N = 15;
    struct Node
    {
        int x,y,dir;
    }c,f;
    bool vis[N][N][4][N][N][4];
    char g[N][N];
    int n=10;
    
    bool check(int x,int y)
    {
        return x >= 0 && x < n && y >= 0 && y < n;
    }
    
    void move(Node &t)
    {
        int a=t.x+dx[t.dir], b=t.y+dy[t.dir];
        if(check(a,b) && g[a][b] != '*')
        {
            t.x=a;
            t.y=b;
        }
        else
            t.dir=(t.dir+1)%4;
    }
    
    int bfs()
    {
        int step=0;
        vis[c.x][c.y][c.dir][f.x][f.y][f.dir]=true;
        while(true)
        {
            if(c.x == f.x && c.y == f.y) return step;
            else step++;
            
            move(c);
            move(f);
            
            if(vis[c.x][c.y][c.dir][f.x][f.y][f.dir]) 
                return 0;
            else
                vis[c.x][c.y][c.dir][f.x][f.y][f.dir]=true;
        }
    }
    
    int main()
    {
        for(int i=0;i<n;i++) scanf("%s",g[i]);
    
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if(g[i][j] == 'C')
                    c={i,j,0};
                else if(g[i][j] == 'F')
                    f={i,j,0};
    
        cout<<bfs()<<endl;
        //system("pause");
        return 0;
    }
    
  • 相关阅读:
    P2764 最小路径覆盖问题
    P1402 酒店之王 网络流
    P2597 [ZJOI2012]灾难 拓扑排序
    FJOI2017 矩阵填数
    2019.2.27模拟
    2019.2.26模拟
    SDOI2013 方程
    [AH2017/HNOI2017]抛硬币
    Lucas定理和扩展Lucas定理
    LuoguP4861 按钮
  • 原文地址:https://www.cnblogs.com/fxh0707/p/14867537.html
Copyright © 2011-2022 走看看