题目大意:国际象棋给你一个起点和一个终点,按骑士的走法,从起点到终点的最少移动多少次。

求最少明显用bfs,下面给出三种搜索算法程序:

  1. // BFS
  2. #include<cstdio>
  3. #include<queue>
  4. #include<cstring>
  5. using namespace std;
  6. const int maxn=;
  7. int r1,c1,r2,c2;
  8. struct Node
  9. {
  10. int r,c;
  11. Node(int r,int c):r(r),c(c){}
  12. };
  13. int vis[maxn][maxn];
  14. int dist[maxn][maxn];
  15. queue<Node> Q;
  16. int dr[]={-,-,-,-,,,,};
  17. int dc[]={-,,,-,,-,,-};
  18. int BFS()
  19. {
  20. if(r1==r2&&c1==c2) return ;
  21. while(!Q.empty()) Q.pop();
  22. memset(vis,,sizeof(vis));
  23. vis[r1][c1]=;
  24. dist[r1][c1]=;
  25. Q.push(Node(r1,c1));
  26. while(!Q.empty())
  27. {
  28. Node node=Q.front();Q.pop();
  29. int r=node.r,c=node.c;
  30. for(int d=;d<;d++)
  31. {
  32. int nr=r+dr[d];
  33. int nc=c+dc[d];
  34. if(nr>=&&nr< && nc>= &&nc< &&vis[nr][nc]==)
  35. {
  36. if(nr==r2&&nc==c2) return dist[r][c]+;
  37. dist[nr][nc]=+dist[r][c];
  38. Q.push(Node(nr,nc));
  39. vis[nr][nc]=;
  40. }
  41. }
  42. }
  43. return -;
  44. }
  45. int main()
  46. {
  47. char str1[],str2[];
  48. while(scanf("%s%s",str1,str2)==)
  49. {
  50. r1=str1[]-'';
  51. c1=str1[]-'a';
  52. r2=str2[]-'';
  53. c2=str2[]-'a';
  54. printf("To get from %s to %s takes %d knight moves.\n",str1,str2,BFS());
  55. }
  56. return ;
  57. }

DFS:

注意visited结点,如果步数较小也继续搜索

  1. // DFS
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. using namespace std;
  6. const int maxn=;
  7. int r1,c1,r2,c2;
  8. struct Node
  9. {
  10. int r,c;
  11. Node(int r,int c):r(r),c(c){}
  12. };
  13. int vis[maxn][maxn];
  14. int dist[maxn][maxn];
  15. int dr[]={-,-,-,-,,,,};
  16. int dc[]={-,,,-,,-,,-};
  17. int ans;//最终答案
  18. void DFS(int r,int c,int len)
  19. {
  20. if(ans<=len || r< || r>= || c< || c>=) return ;//剪枝
  21. if(r==r2&&c==c2) ans=min(ans,len);
  22. if(vis[r][c]== || dist[r][c]>len)
  23. {
  24. vis[r][c]=;
  25. dist[r][c]=len;
  26. }
  27. else if(vis[r][c]== && len >= dist[r][c] )
  28. return ;
  29. for(int d=;d<;d++)
  30. {
  31. int nr=r+dr[d];
  32. int nc=c+dc[d];
  33. DFS(nr,nc,len+);
  34. }
  35. }
  36. int main()
  37. {
  38. char str1[],str2[];
  39. while(scanf("%s%s",str1,str2)==)
  40. {
  41. r1=str1[]-'';
  42. c1=str1[]-'a';
  43. r2=str2[]-'';
  44. c2=str2[]-'a';
  45. memset(vis,,sizeof(vis));
  46. ans=;
  47. DFS(r1,c1,);
  48. printf("To get from %s to %s takes %d knight moves.\n",str1,str2,ans);
  49. }
  50. return ;
  51. }

A*算法:

g函数为沿路径从起点到当前点的移动耗费(经过的步数),启发函数h为当前格子到终点横坐标差与纵坐标差的和(曼哈顿距离),用优先队列保存每个状态按照g+h排序。通常,我们令水平或者垂直移动的耗费为10,对角线方向耗费为14。取这些值是因为沿对角线的距离是沿水平或垂直移动耗费的的根号2,或者约1.414倍。为了简化,可以用10和14近似。

bfs

  1. #include <cstring>
  2. #include <iostream>
  3. #include <cmath>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <queue>
  7. #include <cstdio>
  8.  
  9. using namespace std;
  10.  
  11. const int maxn = ;
  12.  
  13. struct Node{
  14. int x,y,step;
  15. int f,g,h;
  16. // g函数为走到当前状态的经过的步数,启发函数h为当前格子到终点横坐标差与纵坐标差的和,用优先队列保存每个状态按照g+h排序
  17. bool operator < (const Node & tmp) const{
  18. return f > tmp.f;
  19. }
  20. }node;
  21.  
  22. bool visd[maxn][maxn];
  23. priority_queue<Node> Que;
  24. int dirs[][]={{-,-},{-,},{,-},{,},{-,-},{-,},{,-},{,}};
  25. int start_x,start_y,end_x,end_y,ans;
  26.  
  27. bool isIN(int x,int y)
  28. {
  29. if(x>=||x<)return false;
  30. if(y>=||y<)return false;
  31. return true;
  32. }
  33. void init()
  34. {
  35. memset(visd,false,sizeof(visd));
  36. while(!Que.empty())Que.pop();
  37. Node S;
  38. S.x=start_x;S.y=start_y;
  39. S.step=;S.g=;S.h=(abs(end_x-start_x)+abs(end_y-start_y))*;
  40. S.f=S.g+S.h;
  41. visd[S.x][S.y]=true;
  42. Que.push(S);
  43. ans=-;
  44. }
  45.  
  46. void Astar()
  47. {
  48. Node A,B;
  49. while(!Que.empty())
  50. {
  51. A=Que.top();Que.pop();
  52. if(A.x==end_x&&A.y==end_y)
  53. {
  54. ans=A.step;
  55. break;
  56. }
  57. for(int i=;i<;i++)
  58. {
  59. int xx=dirs[i][]+A.x;
  60. int yy=dirs[i][]+A.y;
  61. if(isIN(xx,yy)==false||visd[xx][yy])continue;
  62. B.x=xx;B.y=yy;
  63. B.step=A.step+;
  64. B.g=A.g+;
  65. B.h=(abs(end_y-yy)+abs(end_x-xx))*;
  66. B.f=B.g+B.h;
  67. visd[B.x][B.y]=true;
  68. Que.push(B);
  69. }
  70. }
  71. }
  72.  
  73. int main()
  74. {
  75. char line[];
  76. while(gets(line))
  77. {
  78. start_x=line[]-'a';start_y=line[]-'';
  79. end_x=line[]-'a';end_y=line[]-'';
  80. init();
  81. Astar();
  82. printf("To get from %c%c to %c%c takes %d knight moves.\n",line[],line[],line[],line[],ans);
  83. }
  84.  
  85. return ;
  86. }

POJ 2243 简单搜索 (DFS BFS A*)的更多相关文章

  1. 简单搜索dfs, 简单的修剪搜索

    选择最合适的语言做一个项目是非常重要的.但,熟练的掌握自己的武器,这也是非常重要的. ========================================================= ...

  2. poj 1426 Find The Multiple (简单搜索dfs)

    题目: Given a positive integer n, write a program to find out a nonzero multiple m of n whose decimal ...

  3. POJ - 1321 棋盘问题 简单搜索 dfs 格子

    点这里去看题 思路:本题的难点在k<n的情况,所以我们可以另dfs中的两个参数分别代表起始行和待放棋子个数(待放棋子只能放在起始行后面的行),然后用一个c[8]来表示每一列放旗子的情况来判断列不 ...

  4. kb-01-a<简单搜索--dfs八皇后问题变种>

    题目描述: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的 ...

  5. poj2386(简单的dfs/bfs)

    题目链接:http://poj.org/problem?id=2386 Description Due to recent rains, water has pooled in various pla ...

  6. poj 1167 简单搜索

    这题主要是注意好限定的条件 条件1:每个公交车都至少要到达两次 条件2:公交车相同时间和相同间隔是属于两种车辆 条件3:不同的车可能到达时间相同 上述都是深搜的重要条件: #include<al ...

  7. 棋盘问题 简单搜索DFS

    Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子 ...

  8. 连连看(简单搜索)bfs

    连连看Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. 搜索进阶课件,视频,代码(状态压缩搜索,折半搜索,dfs,bfs总结)

    链接:https://pan.baidu.com/s/1-svffrprCOO4CtQoCTQ9hQ 提取码:h909 复制这段内容后打开百度网盘手机App,操作更方便哦

随机推荐

  1. C++学习day1

    1. 有符号整数 对于有符号整数,最高位为0表示正数,为1表示负数 负数的绝对值为除最高位外,其余取反再加1 int 字节数:4,取值范围:-232~232-1 最大值为232-1 最小值即为 000 ...

  2. mongodb管理与安全认证

    mongodb数据管理 数据的导出.数据导入数据导出 mongoexport [使用mongoexport -h查看参数] 数据导入 mongoimport [使用mongoimport -h查看参数 ...

  3. 题解-AtCoder-agc006C Rabbit Exercise

    Problem AtCoder & bzoj 题意:数轴上有\(n\)个点(初始坐标均为整数),编号为\(1\)~\(n\).给出\(m\)个操作. 每个操作会选定点\(a\),然后随机在点\ ...

  4. $Django 路飞之小知识回顾,Vue之样式element-ui,Vue绑定图片--mounted页面挂载--路由携带参数

    一 小知识回顾 1 级联删除问题 2 一张表关联多个表,比如有manytomanyfileds forignkey,基于对象查询存在的问题:反向查询的时候  表名小写_set.all()不知是哪个字段 ...

  5. zabbix3.0.4使用percona-monitoring-plugins插件来监控mysql5.6的详细实现过程

    zabbix3.0.4使用percona-monitoring-plugins插件来监控mysql5.6的详细实现过程 因为Zabbix自带的MySQL监控没有提供可以直接使用的Key,所以一般不采用 ...

  6. FreeSWITCH 增删模组

    今天在尝试FreeSWITCH新功能时,遇到一个问题,就是该功能所需要的模组没有加载,导致写了好久的代码不能看到效果,让人很是忧伤啊! 再此,将FS模组增删的方法记录下,以方便遇到同样问题的童鞋. 具 ...

  7. 搭建基于IDEA+Selenium+Java+TestNG+Maven+Jenkins+SVN的Web端UI自动化测试环境

    第一步:工具下载安装配置 JDK安装与配置 IDEA安装与配置 Maven安装与配置 Tomcat部署与配置 Jenkins部署与配置 Svn安装与配置 各浏览器驱动下载与配置 第二步:集成各个工具到 ...

  8. CSS 媒体查询@media

    1. 概述 1.1 定义 @media可以针对不同的屏幕尺寸(媒体类型)设置不同的样式,在响应式页面中,@media非常有用.重置浏览器大小的过程中,页面也会根据浏览器的宽度和高度重新渲染页面. 1. ...

  9. input file 多张图片上传 获取地址 ——fileReader

    //上传图片 $('#files').change(function(e){ var fil = this.files; var m =0; if(fil.length>3){ alert('重 ...

  10. iOS 10 申请隐私权限的一些常用选项

    Privacy - Photo Library Usage Description                               访问相册   Privacy - Camera Usag ...