[USACO11OPEN] Corn Maze S

该文章介绍了一道关于奶牛在迷宫中寻找最短路径的问题,题目要求使用BFS算法解决。难点在于迷宫中存在传送门,需要设计特殊处理函数csm()来找到对应传送门的位置。通过创建node结构体存储位置和步数,从起点开始进行BFS搜索,遇到传送门时更新位置,直到到达终点输出最短步数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

P1825 [USACO11OPEN] Corn Maze S这道题就是一个BFS的题,因为他要求最短路径而不是方案数,还行吧,想明白了就不难。

这道题如果去掉了传送门的话就太简单了,但是又了这个传送门就有一点点难了(瞎说的)

这道题可以定义一个struct来存储他到的这个点的下标和距离

struct node{
	ll x,y,t;
    //第几行,第几列,走了多少步了
};

他说“如果一头奶牛处在这个装置的起点或者终点,这头奶牛就必须使用这个装置。”

所以可以开一个函数,记录它的另外一个点,也就是奶牛被传送到的那个点

void csm(ll &nx,ll &ny){//一定要写取址符号,要不然就没用了
	for(int i=1;i<=n;i++)//查找
		for(int j=1;j<=m;j++)
			if(a[i][j]==a[nx][ny]&&!(nx==i&&ny==j)){//它必须是这个传送门,而且还不能和现在这个点是一样的,切记不要写成nx!=i&&ny!=j应该是!(nx==i&&ny==j)
				nx=i;//改变位置
				ny=j;
				return ;//结束
			}
}

查找一开始的点

for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
			if(a[i][j]=='@') sx=i,sy=j;
		}

后面就是一个几乎纯模板的bfs,就只是加了一个如果到了这个点就更改位置

q.push({sx,sy,0});//一开始距离为0
while(!q.empty()){//bfs
	ll xx=q.front().x,yy=q.front().y,tt=q.front().t;
    //这个点的下标和他的距离
	q.pop();
	if(a[xx][yy]>='A'&&a[xx][yy]<='Z') csm(xx,yy);
    //如果他是一个传送门,那么就转移
	if(a[xx][yy]=='='){//如果已经到达终点,那么按照bfs最短路径的性质可以直接输出
		cout<<tt;
		exit(0);//结束
	}
	for(int i=0;i<4;i++){//进入新的点
		ll nx=xx+dx[i],ny=yy+dy[i];//下标
		if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&a[nx][ny]!='#'&&vis[nx][ny]==0){
            //如果下标在这个迷宫里,并且他不是障碍还没有来过
		    vis[nx][ny]=1;//标记
			q.push({nx,ny,tt+1});//记录
		}
	}
}

这道题就结束了(我就说想明白了就不难了,中国人不骗中国人)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值