关于搜索,内容其实也不是很少,深搜,广搜以及启发式搜索。
但我目前还掌握的不多,启发式搜索还没有去涉及,首先我还是把深搜和广搜这两个多做做题目。
关于广搜,有个模板,套用就可以
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 }