• [USACO06JAN]树林The Grove


    树木(grove)
    Time Limit: 1Sec Memory Limit: 64 MB
    【Description】
    牧场里有一片树林,林子里没有坑.
    贝茜很想知道,最少需要多少步能围绕树林走一圈,最后回到起点.她能上
    下左右走,也能走对角线格子.牧场被分成R 行C 列(1≤R≤50,1≤C≤50).下
    面是一张样例的地图,其中“.”表示贝茜可以走的空地, “X”表示树林, “*”
    表示起点.而贝茜走的最近的路已经特别地用“+”表示出来.

    ...+...
    ..+X+..
    .+XXX+.
    ..+XXX+
    ..+X..+
    ...+++*
    题目保证,最短的路径一定可以找到.
    【Input】
    第1 行输入R 和C,接下来R 行C 列表示一张地图.地图中的符号如题
    干所述.
    【Output】、
    输出最少的步数.
    【Sample Input】
    6 7
    .......
    ...X...
    ..XXX..
    ...XXX.
    ...X...
    ......*
    【Sample Output】
    13

    题解:

    有一种很有意思的做法就是随便找一棵树向下沿出一条线,不能从右向左跨越这条线,如果从左向右跨越这条线的话就记为dis[1][x][y],那么只要是跨过了这条线就形成了一个环啦,最后的答案当然是dis[1][bx][by]

    代码:

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<queue>
    using namespace std;
    const int INF=1e9;
    const int cc[8][2]={{1,0},{-1,0},{0,-1},{0,1},{1,1},{-1,-1},{-1,1},{1,-1}};
    int dis[2][55][55],bx,by,r,c,caty,catx;char st[55][55];
    struct hh{int x,y,id;};
    void bfs()
    {
        queue<hh>q;
        q.push((hh){bx,by,0});
        memset(dis,0x7f,sizeof(dis));
        dis[0][bx][by]=0;
        while (!q.empty())
        {
            hh now=q.front(); q.pop();
            for (int i=0;i<8;i++)
            {
                int xx=now.x+cc[i][0],yy=now.y+cc[i][1];
                if (xx<1 || yy<1 || xx>r || yy>c || st[xx][yy]=='X') continue;
                if (yy==caty && now.y>caty && now.x>catx) continue;
                if (now.y==caty && yy>caty && now.x>catx) 
                {
                    if (dis[1][xx][yy]>dis[0][now.x][now.y]+1)
                    {
                        dis[1][xx][yy]=dis[0][now.x][now.y]+1;
                        q.push((hh){xx,yy,1});
                    }       
                }
                else
                {
                    if (dis[now.id][xx][yy]>dis[now.id][now.x][now.y]+1)
                    {
                        dis[now.id][xx][yy]=dis[now.id][now.x][now.y]+1;
                        q.push((hh){xx,yy,now.id});
                    }   
                }
            }
        }
        printf("%d",dis[1][bx][by]);
    }
    int main()
    {
        int i,j;
        scanf("%d%d",&r,&c);
        bool vv=0;
        for (i=1;i<=r;i++)
        {
            scanf("%s",st[i]+1);
            for (j=1;j<=c;j++)
            {
                if (st[i][j]=='*') bx=i,by=j;
                if (st[i][j]=='X' && !vv) vv=1,caty=j,catx=i;
            }
        }  
        bfs();  
    }
  • 相关阅读:
    利用 Makefile 写的小程序
    linux内核学习之进程管理------task_struct结构体
    智能指针
    explicit 关键字
    ant脚本编写
    FROM_UNIXTIME 格式化MYSQL时间戳函数
    Dubbo架构设计详解-转
    Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)转
    SiteMesh详解
    sitemesh使用步骤
  • 原文地址:https://www.cnblogs.com/zzrblogs/p/10461630.html
Copyright © 2020-2023  润新知