知识点:广搜
一个寻找路径的问题,题目的pdf里面说了,筛子能够移动的规则是top的数字和要移动的位置上的数字相同或者是-1,不是移动之后地图数字和与它挨着的,也就是筛子最底面的数字相同,这里刘汝佳的翻译好像就是这个意思,是错的,保证,要么只有一条路径能够回到起点,要么没有,所以题目保证的是有唯一解或者没有解,不会是多解,无权图的最短路可以用bfs来实现,但是为什么能用最短路求唯一的路径还是想不明白
一个难点就是状态怎么转换,很明显状态是四维的,除了坐标,还有筛子的顶面前面,只看顶面前面就能唯一确定一个筛子的状态,这里一个很重要的规律就是两个想对的筛子和是7,假如x第一行是1,向x增大的方向是前面,也就是向前转,向前转,原来的top变为了front,原来的7-front变为了top,向后转同理,这个情况稍微简单一点,然后是向左向右转,假如每种形态(上前确定)我们记录它左边的点数,当然右边的也可以,那么左转front不变,top变为7-原来左边的点数,右转front不变,top变为原来左边的点数,这样就可以把状态转换的数组预先处理出来了,
接下来就是广搜,然后打印路径了,这里打印路径用的是循环的方法,并且用结构体保存数据,和之前用数组保存相比有很大改进,然后既然题目说的只有一条路径,那么udebug上面的数据应该是不合标准的,因为它最少可以有两个能回到终点的路径
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define mk make_pair
#define sz(x) ((int) (x).size())
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;
struct state {
int x, y, top, front;
state() {
}
state(int a, int b, int c, int d): x(a), y(b), top(c), front(d) {
}
};
int n, m, r, c, f1, f2, mat[15][15], rec[10][10];
int dx[4] = {
1, -1, 0