bfs学习
今天做到了bfs的练习,顺便写下心得。。。
bfs能解决搜索和最短路径的问题。
下面是学习心得:
typedef struct point //定义点
{
int x;
int y;
}P;
bfs()
{
int level[N]; //记录队列中元素层数,即从起点到该点最短路径距离
P father[NX][NY],queue[N]; //father用来记录父节点,queue用来记录队列
int top=0; //top用来记录队列长度,并指向最后节点
for(int i=0;i<nx;i++)
for(int j=0;j<ny;j++)
{
father[i][j].x=-1; //初始化father
father[i][j].y=-1;
}
queue[top].x=x0; //对起点进行赋值
queue[top].y=y0;
father[x0][y0].x=x0;
father[x0][y0].y=y0;
top++;
for(int i=0;i<top;i++)
{
for(遍历第i个元素的邻接点)
{
if(邻接点没标记) //若邻接点father为-1
{
父节点记为第i个元素;
queue[top]赋值为该邻接点; //把元素接到队列上
level[top]=level[i]+1; //元素层次为父节点层次+1
top++; //队列长度+1
}
if(邻接点满足条件)
{
return ...;
}
}
}
}
上一道训练题:
Description
the problem is determining the smallest number of knight moves between two given squares and that, once you have accomplished this, finding the tour would be easy.
Of course you know that it is vice versa. So you offer him to write a program that solves the "difficult" part.
Your job is to write a program that takes two squares a and b as input and then determines the number of knight moves on a shortest route from a to b.
Input
Output
Sample Input
e2 e4
a1 b2
b2 c3
a1 h8
a1 h7
h8 a1
b1 c3
f6 f6
Sample Output
To get from e2 to e4 takes 2 knight moves.
To get from a1 to b2 takes 4 knight moves.
To get from b2 to c3 takes 2 knight moves.
To get from a1 to h8 takes 6 knight moves.
To get from a1 to h7 takes 5 knight moves.
To get from h8 to a1 takes 6 knight moves.
To get from b1 to c3 takes 1 knight moves.
To get from f6 to f6 takes 0 knight moves.
我的题解(很水,有改进空间):
#include<stdio.h>
#include<string.h>
int dx[8]={-1,-1,-2,-2,1,1,2,2}; //对应的xy变化表
int dy[8]={2,-2,1,-1,2,-2,1,-1};
typedef struct point
{
int x;
int y;
}P;
int bfs(char* s1,char* s2)
{
int x1=(int)(s1[0]-'a'+1); //转化为数字
int x2=(int)(s2[0]-'a'+1);
int y1=(int)(s1[1]-'0');
int y2=(int)(s2[1]-'0');
int level[80],top=0,flag; //top用来记录队列长度,并可用于指向队尾
P father[10][10],queue[80]; //father记录父节点,queue记录队列
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
{
father[i][j].x=-1; //父节点初始化为-1
father[i][j].y=-1;
}
level[top]=0;
father[x1][y1].x=x1;
father[x1][y1].y=y1;
queue[top].x=x1;
queue[top++].y=y1;
if(x1==x2&&y1==y2)
return 0;
for(int i=0;i<top;i++)
{
flag=0;
for(int j=0;j<8;j++) //标记所有邻接点
{
int tempx,tempy;
tempx=queue[i].x+dx[j];
tempy=queue[i].y+dy[j];
if(tempx<=8&&tempx>0&&tempy<=8&&tempy>0&&father[tempx][tempy].x==-1)
{
father[tempx][tempy].x=queue[i].x;
father[tempx][tempy].y=queue[i].y;
queue[top].x=tempx;
queue[top].y=tempy;
level[top++]=level[i]+1; //level用来记录当前元素层次
}
if(tempx==x2&&tempy==y2)
{
flag=1;
break;
}
}
if(flag==1)
return level[top-1];
}
}
int main()
{
char s1[3],s2[3];
int num;
while(scanf("%s%s",s1,s2)!=EOF)
{
num=bfs(s1,s2); //输入
printf("To get from %s to %s takes %d knight moves.\n",s1,s2,num);
}
return 0;
}
bfs学习的更多相关文章
- 广度优先搜索 BFS 学习笔记
广度优先搜索 BFS 学习笔记 引入 广搜是图论中的基础算法之一,属于一种盲目搜寻方法. 广搜需要使用队列来实现,分以下几步: 将起点插入队尾: 取队首 \(u\),如果 $u\to v $ 有一条路 ...
- 简单的BFS学习笔记
什么是BFS传送门. 今天学习BFS,加油! 先定义个数组: struct Node{ int a=0; int b=0; int step=0; }; int map[5][4]={//地图 0,0 ...
- BFS学习 Codeforces 301_div.2_Ice Cave
C. Ice Cave time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...
- DFS BFS 学习总结
DFS 深度优先搜索 基本思路: if(true) 返回 典型例题: 1.马走日(非常典型) #include<iostream> #include<cstring> usin ...
- 算法学习之BFS、DFS入门
算法学习之BFS.DFS入门 0x1 问题描述 迷宫的最短路径 给定一个大小为N*M的迷宫.迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动.请求出从起点到终点所需的最小步数.如果不能到 ...
- 记录----第一次使用BFS(广度搜索)学习经验总结
学习经验记录与分享—— 最近在学习中接触到了一种解决最短路径的实用方法----BFS(广度搜索),在这里总结并分享一下第一次学习的经验. 首先第一个要了解的是"queue"(队列函 ...
- Day1 BFS算法的学习和训练
因为自己的原因,之前没有坚持做算法的相应学习,总是觉得太难就半途而废,真的算是一个遗憾了,所以现在开始,定一个30天入门学习算法计划. 我是根据<算法图解>的顺序进行安排的,自己对 ...
- 2019-01-31 Python学习之BFS与DFS实现爬取邮箱
今天学习了python网络爬虫的简单知识 首先是一个爬取百度的按行读取和一次性爬取 逐行爬取 for line in urllib.request.urlopen("http://www.b ...
- 带你学习BFS最小步数模型
最小步数模型 一.简介 最小步数模型和最短路模型的区别? 最短路模型:某一个点到另一个点的最短距离(坐标与坐标之间) 最小步数模型:不再是点(坐标),而是状态到另一个状态的转变 BFS难点所在(最短路 ...
随机推荐
- OC学习10——内存管理
1.对于面向对象的语言,程序需要不断地创建对象.这些对象都是保存在堆内存中,而我们的指针变量中保存的是这些对象在堆内存中的地址,当该对象使用结束之后,指针变量指向其他对象或者指向nil时,这个对象将称 ...
- 截取ip 不加引号
ip a |grep /26 |cut -b10- | cut -d / -f 1
- 通过 Sublime Package Control 安装插件后不能用的解决办法
最近使用 Sublime 写 SASS 的时候需要使用高亮功能,通过 Package Control 安装了相关插件,但是安装之后没有反应,再次打开 Package Control 的时候,已经搜索不 ...
- python 将文件夹内的图片转换成PDF
import os import stringfrom PIL import Imagefrom reportlab.lib.pagesizes import A4, landscapefrom re ...
- bzoj 1597: [Usaco2008 Mar]土地购买
Description 农 夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000 ...
- bzoj 3142: [Hnoi2013]数列
Description 小T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨.股票每天的价格已知是正整数,并且由于客观上的原因,最多只能为N.在疯涨的K天中小T观察到:除第一天外每天的股价都比前 ...
- bzoj 4817: [Sdoi2017]树点涂色
Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...
- vim置于后台,vim 编辑多文件
这里介绍一个很实用的方法:1.将vim置于后台,直接按 ctrl + z可以将当前的vim置于后台 2.然后可以去别的目录再打开一个 当你需要打开之前的vim的时候3.打jobs命令看当前有哪些vim ...
- Maven代理设置
公司需要设置代理才能上网,而运行Maven时需要下载依赖的库. 怎么办呢? 原来Maven也像IE一样,可以设置HTTP代理的. 步骤如下: ·编辑 ~/.m2/setting.xml 文件.如果该目 ...
- COM学习(二)——COM的注册和卸载
COM组件是跨语言的,组件被注册到注册表中,在加载时由加载函数在注册表中查找到对应模块的路径并进行相关加载.它的存储规则如下: 1. 在注册表的HKEY_CLASSES_ROOT中以模块名的方式保存着 ...