题目链接:
解题思路:
常规思路是 枚举每个点,暴力dfs,然后选择最大的那个 但题目只给了1000MS 这就需要剪枝了
剪枝1:
假设当前答案长度为ans,那么当我们走到一个点(x, y)的时候,bfs一下判断能接触的格子数。假设现在能从(x, y)走到的点,我们都能到达,这是最好的情况。设从(x, y)能走到的点数为maxlen,那么如果从出发点走到(x, y)经过的格子,加上maxlen,都没有ans的长度大,那么不管从(x, y)怎么搜,我们都不能取代我们现在的ans(长才是王道懂不懂),那么直接回溯,不要这个点了。这个剪枝效力还是不错的。
而如果等于的话 我们需要一个标记 flag 来表示当前串和 ans串的大小关系
剪枝2: 如果ans串已经是最大可能长度 且搜索的起点小于ans串的起点 则直接跳过
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<time.h>
#define printime printf("%.3lf\n",(double)clock() / CLO