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;
}
posted @ 2021-06-09 16:43  Dazzling!  阅读(66)  评论(0编辑  收藏  举报