整体思路是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]&#