zoukankan      html  css  js  c++  java
  • P1518 两只塔姆沃斯牛 The Tamworth Two(简单的搜索题)

    题目描述
    两只牛逃跑到了森林里。农夫John开始用他的专家技术追捕这两头牛。你的任务是模拟他们的行为(牛和John)。

    追击在10x10的平面网格内进行。一个格子可以是:

    一个障碍物, 两头牛(它们总在一起), 或者 农民John. 两头牛和农民John可以在同一个格子内(当他们相遇时),但是他们都不能进入有障碍的格子。

    一个格子可以是:

    . 空地

    • 障碍物

    C 两头牛

    F 农民John

    这里有一个地图的例子:

    …*…

    …*.F…

    …*…

    …C…*

    .

    ..

    牛在地图里以固定的方式游荡。每分钟,它们可以向前移动或是转弯。如果前方无障碍(地图边沿也是障碍),它们会按照原来的方向前进一步。否则它们会用这一分钟顺时针转90度。 同时,它们不会离开地图。

    农民John深知牛的移动方法,他也这么移动。

    每次(每分钟)农民John和两头牛的移动是同时的。如果他们在移动的时候穿过对方,但是没有在同一格相遇,我们不认为他们相遇了。当他们在某分钟末在某格子相遇,那么追捕结束。

    读入十行表示农夫John,两头牛和所有障碍的位置的地图。每行都只包含10个字符,表示的含义和上面所说的相同,你可以确定地图中只有一个’F’和一个’C’.'F’和’C’一开始不会处于同一个格子中。

    计算农夫John需要多少分钟来抓住他的牛,假设牛和农夫John一开始的行动方向都是正北(即上)。 如果John和牛永远不会相遇,输出0。

    输入输出格式
    输入格式:
    每行10个字符,表示如上文描述的地图。

    输出格式:
    输出一个数字,表示John需要多少时间才能抓住牛们。如果John无法抓住牛,则输出0。

    输入输出样例
    输入样例#1:




    .F…


    …C…

    .
    ..
    输出样例#1:
    49
    说明
    翻译来自NOCOW

    USACO 2.4
    农夫抓两头牛,农夫跟牛的行进方式一样,但是要注意

    牛-------> <------农夫

    这种情况不算相遇。

    #include<bits/stdc++.h>
    using namespace std;
    const int dx[4]={-1,0,1,0};//上、右、下、左四个方向
    const int dy[4]={0,1,0,-1};
    int cx,cy,ct;
    int fx,fy,ft;
    bool f[21][21],v[21][21][4][21][21][4];
    void dfs(int k)
    {
        if(cx==fx && cy==fy)
        {
            printf("%d
    ",k);
            return ;
        }
        if(v[fx][fy][ft][cx][cy][ct]==false)
        {
            printf("0
    ");
            return;
        }
        v[fx][fy][ft][cx][cy][ct]=false;
        if(f[cx+dx[ct]][cy+dy[ct]]==false)
        {
            ct++;if(ct==4) ct=0;
        }
        else cx=cx+dx[ct],cy=cy+dy[ct];
        if(f[fx+dx[ft]][fy+dy[ft]]==false)
        {
            ft++;if(ft==4) ft=0;
        }
        else fx=fx+dx[ft],fy=fy+dy[ft];
        dfs(k+1);
     }
    int main()
    {
        int i,j;char st[21];
        memset(f,false,sizeof(f));
        for(i=1;i<=10;i++)
        {
            scanf("%s",st+1);
            for(j=1;j<=10;j++)
            {
                if(st[j]=='.') f[i][j]=true;
                if(st[j]=='F') fx=i,fy=j,f[i][j]=true;
                if(st[j]=='C') cx=i,cy=j,f[i][j]=true;
            }
        }
        ct=ft=0;
        memset(v,true,sizeof(v));
        dfs(0);
        return 0;
    }
    
  • 相关阅读:
    160628、利用Oracle rownum让表排序字段值连续
    160627、你想知道的关于JavaScript作用域的一切
    160624、Spark读取数据库(Mysql)的四种方式讲解
    160623、理解 Promise 的工作原理
    160622、详解JavaScript变量提升
    160621、Java注解教程及自定义注解
    详解JavaScript数组过滤相同元素的5种方法
    box-shadow
    Axios 中文说明
    一步一步学Vue(九) 路由元数据
  • 原文地址:https://www.cnblogs.com/lunatic-talent/p/12798849.html
Copyright © 2011-2022 走看看