『一本通』广搜的优化技巧

Knight Moves

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int dx[9]={2,2,1,1,-1,-1,-2,-2},dy[9]={-1,1,-2,2,-2,2,-1,1};
 4 int n,L,step[305][305];
 5 struct node{int x,y;}b,e;
 6 queue<node>q;
 7 bool check(int x,int y) {return x>=0&&x<L&&y>=0&&y<L;}
 8
 9 void BFS() {
10     while(!q.empty()) q.pop();
11     memset(step,0x7f,sizeof(step));
12     q.push(b),step[b.x][b.y]=0;
13     while(step[e.x][e.y]>1e3) {
14         int X=q.front().x,Y=q.front().y; q.pop();
15         for(int i=0;i<8;i++) {
16             int nx=X+dx[i],ny=Y+dy[i];
17             if(!check(nx,ny)||step[nx][ny]<1e3) continue;
18             step[nx][ny]=step[X][Y]+1;
19             q.push((node){nx,ny});
20         }
21     }
22     printf("%d\n",step[e.x][e.y]);
23 }
24
25 int main() {
26     scanf("%d",&n);
27     while(n--) {
28         scanf("%d%d%d%d%d",&L,&b.x,&b.y,&e.x,&e.y);
29         if(b.x==e.x&&b.y==e.y) puts("0");
30         else BFS(); //Breadth-First Search(广度优先搜索)
31     }
32 }

原文地址:https://www.cnblogs.com/qq8260573/p/10340152.html

时间: 2024-10-03 19:47:33

『一本通』广搜的优化技巧的相关文章

『一本通』区间DP

石子合并 1 #include<bits/stdc++.h> 2 #define INF 0x3f3f3f3f 3 using namespace std; 4 int n,sm[505][505],bg[505][505],sum[505]; 5 inline int read() { 6 int x=0,f=1; char c=getchar(); 7 while(c<'0'||c>'9') {if(c=='-')f=-1; c=getchar();} 8 while(c>

『一本通』二分与三分

愤怒的牛 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,ans,a[100005]; 4 5 int check(int x) { 6 int cnt=1,lst=a[1]; 7 for(int i=2;i<=n;i++) 8 if(a[i]-lst>=x) cnt++,lst=a[i]; 9 return cnt; 10 } 11 12 int main() { 13 scanf("%d%d&quo

『一本通』哈希和哈希表

Oulipo 1 #include<bits/stdc++.h> 2 #define N 1000000+5 3 using namespace std; 4 typedef unsigned long long ULL; 5 const int b=55; 6 ULL n,m,s,ans,p[N],sum[N]; 7 char s1[N],s2[N]; 8 9 int main() { 10 scanf("%s",s1+1),scanf("%s",s2

『一本通』差分约束系统

Intervals 设$s[k]$表示$0$~$k$之间最少选出多少个整数. 由题得$s[b_i]-s[a_i-1]\ge c_i$,$0\le s[k+1]-s[k] \le 1$ . 根据关系式连边,$SPFA$ 跑一遍 最长路 即可. #include<bits/stdc++.h> using namespace std; const int N=5e4+5; int n,cnt,Min,Max,fro[N],dis[N]; bool vis[N]; struct edge{int to

CodeForces 682C Alyona and the Tree(广搜 + 技巧)

方法:从根节点开始广搜,如果遇到了应该删除的点,就再广搜删掉它的子树并标记,然后统计一下被标记的个数就是答案,所谓技巧就是从根节点开始搜索的时候,如果遇到了某个节点的距离<0,就让它是0,0可以消除负数效应,让后面的点重新参与正常删除操作,这个方法的正确性不难证明,可以自己画一下图.而且还有比较方便的方法就是,记录不被删除的点,然后n-他们就可以了. 代码如下: #include<iostream> #include<cstdio> #include<cstring&g

谈谈前端『新』技术

技术这个行当,永远会有新东西出来,不进则退.更关键的是,前端比起整个软件工程乃至计算机科学体系来说,是个相对新生草莽的领域,近年来前端生态的发展其实都是在向其他领域吸收和学习,不论是开发理念.工程实践还是平台本身(规范.浏览器).所谓的『根正苗红』的前端,不过是整个发展进程中探索的一个阶段而已,那个时代的最佳实践,很多到今天都已经不再适用.过往的经验固然有价值,但这些经验如果不结合对新事物本身的了解,就很难产生正确的判断.这里需要强调的是,学习新事物并不是为了不考虑实际需求的滥用,而是为了获取足

算法学习笔记 二叉树和图遍历—深搜 DFS 与广搜 BFS

图的深搜与广搜 马上又要秋招了,赶紧复习下基础知识.这里复习下二叉树.图的深搜与广搜.从图的遍历说起,图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其经典应用走迷宫.N皇后.二叉树遍历等.遍历即按某种顺序访问"图"中所有的节点,顺序分为: 深度优先(优先往深处走),用的数据结构是栈, 主要是递归实现: 广度优先(优先走最近的),用的数据结构是队列,主要是迭代实现: 对于深搜,由于递归往往可以方便的利

算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS

图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其经典应用走迷宫.N皇后.二叉树遍历等.遍历即按某种顺序訪问"图"中全部的节点,顺序分为: 深度优先(优先往深处走),用的数据结构是栈, 主要是递归实现. 广度优先(优先走近期的).用的数据结构是队列.主要是迭代实现. 对于深搜.因为递归往往能够方便的利用系统栈,不须要自己维护栈.所以通常实

宽搜和广搜、

广搜与深搜的小区别 一般来说,广搜常用于找单一的最短路线,或者是规模小的路径搜索,它的特点是"搜到就是最优解", 而深搜用于找多个解或者是"步数已知(好比3步就必需达到前提)"的标题,它的空间效率高,然则找到的不必定是最优解,必需记实并完成全数搜索,故一般情况下,深搜需要很是高效的剪枝(优化). 像搜索最短路径这些的很显著若是用广搜,因为广搜的特征就是一层一层往下搜的,保证当前搜到的都是最优解,当然,最短路径只是一方面的操作,像什么起码状态转换也是可以操作的.深搜就