目录
- 定义
- 二叉树层次遍历
- 电梯问题
- 倒可乐
- BFS基本思想
- 算法
- 四方访问
定义
BFS 通常是指广度优先搜索(Breadth - First Search),它是一种图形数据结构的遍历算法。从给定的起始顶点开始,首先访问起始顶点的所有邻接顶点,然后再依次访问这些邻接顶点的邻接顶点,以此类推,一层一层地向外扩展搜索,就好像是水波纹一样,从中心向四周扩散。在这个过程中,先被访问到的顶点的邻接顶点会先被探索。
二叉树层次遍历
ccbl(int root)queue<int> Q; //创建一个队列Q.push(root); //将根节点入队列while(!empty(Q) //队列不为空){cur = Q.gethead; //获得队首元素Q.pop(); //将队首元素出队printf("%d",cur); //输出当前节点的值if(!Q.leftchild)Q.push(Q.leftchild); //如果该节点的左儿子不为空,将左儿子加入到队列中if(!Q.rightchild)Q.push(Q.rightchild); //如果该节点的右儿子不为空,将右儿子加入到队列中}
电梯问题
有一个奇怪的电梯,他可以停在任何不层,并且在每个楼层有一个Ki (0<= Ki <=N)。电梯只有两个按钮:上、下。当你在第i层,如果你按下“UP”按钮,你将上升Ki层,也就是说,你将会到达第i+Ki层,如果你按下 “DOWN” 按钮,你会下降Ki层,即您将前往第i-Ki层。当然,电梯不能高于N,也不能低于1。
例如,有6层的建筑物,并且k1=3,k2=3,k3=2,k4=2,k5=2,k6=3。从1楼开始,你河以按下“UP”按钮,你会到4楼,但如果你按下“DOWN”按钮,电梯不做处理,因为它不能下到-2楼。
问:当你在A楼而想去B楼时,至少须按下“UP”或“DOWN”按钮多少次?其中,1<=N,A, B <= 200
样例输入:
6 1 3
3 3 2 2 2 З
样例输出:
3
#include<bits/stdc++. h> using namespace std;
int N,Start, End; int a[202]; int vis[202];
struct pos
{
int level;
int steps;
};
void bfs();int main
{while (scanf ("%d", &N) ==1){if (N = 0) break;scanf ("%d%d", &Start, &End) ;for (int i = 1; i < N; i++){scanf ("%d", &a[i]);vis[i] = 0;}bfs ();}return 0;
}void bfs ()
{pos cur, nex;cur. level = Start;cur. steps = 0;queue<pos>qu;qu. push (cur) ;vis[Start] = 1;while (!qu. empty ()){ cur = qu. front ();qu. pop () ;if (cur. level = End){ printf ("%d\n", cur. steps);return;}nex. level=cur. level + a[cur. level];nex. steps = cur. steps + 1;if(nex. level <= N){if (vis[nex. level] == 0){vis [nex. level] = 1;qu. push (nex);}}nex.level = cur.level - a[ cur.level ];nex. steps = cur. steps + 1;if(nex. level >= 1){ if (vis[nex. level] == 0){vis [nex. level] = 1;qu. push (nex);}}}printf ("-1\n") ;return;
}
倒可乐
题目描述:
每当刘一丁买了可乐,刘二丁就要求和他一起分享,而且一定要喝的和刘一丁一样多。但刘一丁的手中只有两个杯子,它们的容量分别是N和M毫升,可乐的体积为S(S<101)毫升(正好装满一瓶),它们三个之间可以相互倒可乐(都是没有刻度的,且 S=N+M,101>S>0,N>0,M>0)。
如果能平分,请输出倒可乐的最少次数,如果不能,请输出"NO"。
Input
7 4 3
413
000
Output
NO
3
状态转移规则(倒水规则):
- 如果i水杯内水的容量大于j水杯内倒满所需的容量X,则i水杯倒水后的容量为:i-x,j水杯倒水后容量为:j+x
- 如果i水杯内水的容量小于j水杯内倒满所需的容量x,则i水杯倒水后的容量为:0,j水杯倒水后容量为:j+x
- 每操作一次,最少倒水次数+1
BFS基本思想
- 从初始状态S开始,利用规则,生成所有可能的状态,构成树的下一层节点。
- 检查是否出现目标状态G,若未出现,就对该层所有状态节点,分别依次利用规则,生成再下一层的所有状态节点。
- 对新一层的所有状态节点继续检查是否出现G,若未出现,继续按上面思想生成再下一层的所有状态节点,这样一层一层往下展开,直到出现目标状态为止。
算法
Node bfs(node source, node target)
{memset(visit, 0 , sizeof(visit)) ;queue < node> Q;Q.push(source) ;visit[source] = 1 ;while(!Q.empty){Node a = Q.front();Q.pop() ;if(a==target) { return a; }for(对于a所有的后继节点 b)if(visit[b]){ continue ; }Q.push(b) ;visit[b]= 1;//剪枝,保证节点只进队列一次}return NULL;
}
四方访问
定义一个二维数组(全局变量);
int dir[4][2] = { {0,-1},{0,1},{1,0},{-1,0} };
//设当前坐标(X.Y),下步坐标(XX,YY)
for(int i=0; i<4; i++)
{XX = XX + dir[i][0];YY = YY + dir[i][1];......
}