BFS 华容道

使用BFS解决华容道,针对500次询问的效率问题,可以预处理每个点与空格交换位置的耗费。预先计算当空格在点的四周时,转移到其他位置的成本。主函数中,先处理空格到起点四周的耗费,然后通过SPFA算法进行两种状态转移:空格在点周围移动,或点与空格交换位置。实现中需要注意较多细节。
摘要由CSDN通过智能技术生成

这里写图片描述
这里写图片描述
整体思路是BFS没问题,但对于500个询问还是很吃力。但又因为只有一张图,所以我们可以预处理一些东西。
那么来看,对于要移动的点,无非是把空格移动到他的四周,之后交换位置,而交换位置之前有大量无用的转移,而这个转移的耗费对于某个点是确定不变的,而致有转移起点才是有效的,起点与空格交换位置后,空格依然在起点的周围,那么就可以预处理出对于每一个点,他不移动的情况下,若空格在他周围(上下左右)某个位置时,移动到他周围另一个位置的耗费。
而对于主函数,首先处理出空格到起点四周的耗费(因为空格不在起点附近)之后进行spfa,有两个转移。
1,空格从这个点的周围某一位置转移到周围另一个位置,
2,此点与他周围某个位置上的空格交换位置。
细节蛮多的,但推荐自己打。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define ll long long
#define mod 1000000007
using namespace std;
int n,m,Q,a[35][35],l[35][35][5][5],d[35][35][5],vis[35][35][5];
int v[35][35],dis[35][35],wz[5][2]&#
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值