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;
}
posted @ 2018-10-19 21:10  _王小呆  阅读(171)  评论(0编辑  收藏  举报