今天做到了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

A friend of you is doing research on the Traveling Knight Problem (TKP) where you are to find the shortest closed tour of knight moves that visits each square of a given set of n squares on a chessboard exactly once. He thinks that the most difficult part of
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

The input will contain one or more test cases. Each test case consists of one line containing two squares separated by one space. A square is a string consisting of a letter (a-h) representing the column and a digit (1-8) representing the row on the chessboard.

Output

For each test case, print one line saying "To get from xx to yy takes n knight moves.".

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学习的更多相关文章

  1. 广度优先搜索 BFS 学习笔记

    广度优先搜索 BFS 学习笔记 引入 广搜是图论中的基础算法之一,属于一种盲目搜寻方法. 广搜需要使用队列来实现,分以下几步: 将起点插入队尾: 取队首 \(u\),如果 $u\to v $ 有一条路 ...

  2. 简单的BFS学习笔记

    什么是BFS传送门. 今天学习BFS,加油! 先定义个数组: struct Node{ int a=0; int b=0; int step=0; }; int map[5][4]={//地图 0,0 ...

  3. 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 ...

  4. DFS BFS 学习总结

    DFS 深度优先搜索 基本思路: if(true) 返回 典型例题: 1.马走日(非常典型) #include<iostream> #include<cstring> usin ...

  5. 算法学习之BFS、DFS入门

    算法学习之BFS.DFS入门 0x1 问题描述 迷宫的最短路径 给定一个大小为N*M的迷宫.迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动.请求出从起点到终点所需的最小步数.如果不能到 ...

  6. 记录----第一次使用BFS(广度搜索)学习经验总结

    学习经验记录与分享—— 最近在学习中接触到了一种解决最短路径的实用方法----BFS(广度搜索),在这里总结并分享一下第一次学习的经验. 首先第一个要了解的是"queue"(队列函 ...

  7. Day1 BFS算法的学习和训练

    ​ 因为自己的原因,之前没有坚持做算法的相应学习,总是觉得太难就半途而废,真的算是一个遗憾了,所以现在开始,定一个30天入门学习算法计划. ​ 我是根据<算法图解>的顺序进行安排的,自己对 ...

  8. 2019-01-31 Python学习之BFS与DFS实现爬取邮箱

    今天学习了python网络爬虫的简单知识 首先是一个爬取百度的按行读取和一次性爬取 逐行爬取 for line in urllib.request.urlopen("http://www.b ...

  9. 带你学习BFS最小步数模型

    最小步数模型 一.简介 最小步数模型和最短路模型的区别? 最短路模型:某一个点到另一个点的最短距离(坐标与坐标之间) 最小步数模型:不再是点(坐标),而是状态到另一个状态的转变 BFS难点所在(最短路 ...

随机推荐

  1. 框架原理第三讲,RTTCreate,运行时类型创建.(以MFC框架讲解)

    框架原理第三讲,RTTCreate,运行时类型创建.(以MFC框架讲解) 通过昨天的讲解,我们已经理解了运行时类型识别是什么. 比如  CObject * pthis = (Cobject *)Cre ...

  2. CDQ分治与整体二分小结

    前言 这是一波强行总结. 下面是一波瞎比比. 这几天做了几道CDQ/整体二分,感觉自己做题速度好慢啊. 很多很显然的东西都看不出来 分治分不出来 打不出来 调不对 上午下午晚上的效率完全不一样啊. 完 ...

  3. bzoj 2752: [HAOI2012]高速公路(road)

    Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收 ...

  4. 什么是AJAX? AJAX:”Asynchronous JavaScript and XML”中文意思:异步JavaScript和XML。

    指一种创建交互式网页应用的网页开发技术. AJAX并非缩写词,而是由Jesse James Gaiiett创造的名词. 不是指一种单一的技术,而是有机地利用了一系列相关的技术: web标准( Stan ...

  5. idea激活网站地址,亲测可用(windows7,idea 2016)

    help-register-license server,然后输入 http://idea.iteblog.com/key.php

  6. vue2.0表单事件的绑定

    v-model 1.input type="text" <template> <div id="app"> <label for= ...

  7. Robot Framework 学习笔记(二)-------第一个脚本

    robot Framework环境搭建好之后先来一个简单的脚本跑一下 一.新建项目 二.新建测试套件  三.创建测试用例 四.导入Selenium2Library库 因为RF框架编写基于web 的测试 ...

  8. 小白的Python之路 day5 time,datatime模块详解

    一.模块的分类 可以分成三大类: 1.标准库 2.开源模块 3.自定义模块 二.标准库模块详解 1.time与datetime 在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时 ...

  9. 北斗时钟同步系统-GPS卫星授时设备-NTP网络校时服务器

    北斗时钟同步系统-GPS卫星授时设备-NTP网络校时服务器 北斗时钟同步系统-GPS卫星授时设备-NTP网络校时服务器 北斗时钟同步系统-GPS卫星授时设备-NTP网络校时服务器 论述当下网络时间同步 ...

  10. 如何在 iOS 真机运行 Appium

    使用 gui 启动的 appium 1.2.2 也会有这个问题,所以你要把 deviceconsole 复制到 /Applications/Appium.app/Contents/Resources/ ...