BFS【bzoj1667】: [Usaco2006 Oct]Cows on Skates滑旱冰的奶牛

1667: [Usaco2006 Oct]Cows on Skates滑旱冰的奶牛

Description

经过跟Farmer John长达数年的谈判,奶牛们终于如愿以偿地得到了想要的旱冰鞋。农场上大部分的区域都很平整,适合在上面滑动,但有一些小块的土地上有很多的岩石,凭奶牛们的旱冰技术,是没有办法通过的。 农场可以看成一个被划分成R(1<=R<=113)行C(1<=C<=77)列的矩阵。快要开饭了,贝茜发现自己在坐标为(1,1)的格子里,并且她想赶到坐标为(R,C)的牛棚去享用她的晚饭。贝茜知道,以她所在的格子为起点,每次向上、下、左、右滑动(但不能沿对角线滑动),一定能找到一条通往牛棚的、不经过任何有大量岩石的格子的路。请你为她指出任意一条通往牛棚的路径。

妈的傻逼题做这么长时间,真TM菜。

一开始写Dij写挂了,现在回想就是数组开小了,之后写大法师还T。

正解BFS记录路径,当一个模板记。

code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>

using namespace std;

inline int read(){
    int sum=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0'; ch=getchar();}
    return sum*f;
}

const int wx=517;

struct node{
    int x,y;
};

int dx[]={0,1,0,-1,0};
int dy[]={0,0,1,0,-1};

int vis[wx][wx];
int a[wx][wx],ansx[wx],ansy[wx];
char c[wx];
int prex[wx][wx];int prey[wx][wx];
int n,m,ans,num,tot,cnt;
int xx[wx],yy[wx],dis[wx][wx];

queue<node >q;

void bfs(){
    memset(dis,0x3f,sizeof dis);
    dis[1][1]=0; q.push((node){1,1});
    while(q.size()){
        int ux=q.front().x; int uy=q.front().y;
        q.pop();
        for(int i=1;i<=4;i++){
            int ex=ux+dx[i]; int ey=uy+dy[i];
            if(ex<1||ex>n||ey<1||ey>m||a[ex][ey])continue;
            if(dis[ex][ey]>dis[ux][uy]+1){
                dis[ex][ey]=dis[ux][uy]+1;
                q.push((node){ex,ey});
                prex[ex][ey]=ux; prey[ex][ey]=uy;
            }
        }
    }
}

int main(){
    n=read(); m=read();
    for(int i=1;i<=n;i++){
        scanf("%s",c+1);
        for(int j=1;j<=m;j++){
            a[i][j]=(c[j]=='*');
        }
    }
    bfs();
    int nowx=n; int nowy=m;
    while(nowx){
        ansx[++tot]=nowx; ansy[tot]=nowy;
        int tmp=nowx;
        nowx=prex[tmp][nowy]; nowy=prey[tmp][nowy];
    }
    for(int i=tot;i>=1;i--){
        printf("%d %d\n",ansx[i],ansy[i]);
    }
    return 0;
}

转载于:https://www.cnblogs.com/wangxiaodai/p/9818834.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值