zoukankan      html  css  js  c++  java
  • 有关搜索

    关于搜索,内容其实也不是很少,深搜,广搜以及启发式搜索。

    但我目前还掌握的不多,启发式搜索还没有去涉及,首先我还是把深搜和广搜这两个多做做题目。

    关于广搜,有个模板,套用就可以

    1.首先记得用对数据进行初始化,切记,尤其是字符串这种东西,很多题目你如果忘了那么就等着WA吧。
    2.其次就是对于那个队列,要记得清空。因为有可能上一次的直接退出了,而队列里面还有上一个案例的数据。

    1
    #include <stdio.h> 2 #include <string.h> 3 #include <queue> 4 #include <iostream> 5 using namespace std; 6 7 #define judge(x,y,z) mark[x][y][z]&&str1[x][y][z]!='#'&&x>=0&&x<l&&y>=0&&y<r&&z>=0&&z<c //这个判断是很方便,可用于多次判断,当然在这个题目中的话,因为是只用到一次,所以用不用都行。 8 #define MAX 50 9 char str1[MAX][MAX][MAX]; 10 int l,r,c,sx,sy,sz,ex,ey,ez,step[31][31][31]; //step是我用来记录步数的,我没有放进结构体中,是因为有些题目是不一定找得到那个点的,所以那个点的步数就应该为0,用这个就便于判断是否可以找到那个点。 11 int dic[6][3]{0,0,1,0,0,-1,1,0,0,-1,0,0,0,1,0,0,-1,0}; //这是是方向,我写的这个是正对于最多情况,也就是三维的写的。其他的根据实际来更改。 12 13 struct note{ 14 int x,y,z; 15 }; 16 bool mark[MAX][MAX][MAX]; 17 queue<note>s; //定义一个结构体的队列可以简化代码量,因为有一个点要通过三个数据来判断。不然的话,你只能通过定义三个队列来进行判断。 18 19 void bfs(int x,int y,int z) 20 { 21 note u; 22 u.x=x,u.y=y,u.z=z; 23 while(!s.empty()) //这就是对队列的清空,防止还有上一组案例的数据。 24 s.pop(); 25 s.push(u); 26 while(!s.empty()) //当s的队列为空时,说明已经找不到那个点了,所以直接退出。 27 { 28 note v; 29 v=s.front(); 30 s.pop(); 31 if(v.x==ex&&v.y==ey&&v.z==ez) return; 32 for(int i=0;i<6;i++) 33 { 34 u.x=v.x+dic[i][0]; 35 u.y=v.y+dic[i][1]; 36 u.z=v.z+dic[i][2]; 37 if(judge(u.x,u.y,u.z)){ //判断点是否符合条件 38 step[u.x][u.y][u.z]=step[v.x][v.y][v.z]+1; //下一个点的步数在这个点的基础上加一。相当于走了一步 39 mark[u.x][u.y][u.z]=false;      //因为要求的是最短的路。所以一个点在第一次走的时候,一定是最短的。也是通过这个条件来确保一定是最短的。 40 s.push(u);            //这个点符合条件,所以这个点可以放入队列中。 41 } 42 } 43 } 44 }
  • 相关阅读:
    permission 文档 翻译 运行时权限
    TabLayout ViewPager Fragment 简介 案例 MD
    Log 日志工具类 保存到文件 MD
    OkHttp 官方wiki 翻译 MD
    Okhttp 简介 示例 MD
    OkHttp 官方Wiki之【使用案例】
    DialogPlus
    倒计时 总结 Timer Handler CountDownTimer RxJava MD
    RecyclerView 判断滑到底部 顶部 预加载 更多 分页 MD
    CSS3的媒体查询(Media Queries)与移动设备显示尺寸大全
  • 原文地址:https://www.cnblogs.com/Tree-dream/p/5524113.html
Copyright © 2011-2022 走看看