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

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

 // BFS
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=;
int r1,c1,r2,c2;
struct Node
{
int r,c;
Node(int r,int c):r(r),c(c){}
};
int vis[maxn][maxn];
int dist[maxn][maxn];
queue<Node> Q;
int dr[]={-,-,-,-,,,,};
int dc[]={-,,,-,,-,,-};
int BFS()
{
if(r1==r2&&c1==c2) return ;
while(!Q.empty()) Q.pop();
memset(vis,,sizeof(vis));
vis[r1][c1]=;
dist[r1][c1]=;
Q.push(Node(r1,c1));
while(!Q.empty())
{
Node node=Q.front();Q.pop();
int r=node.r,c=node.c;
for(int d=;d<;d++)
{
int nr=r+dr[d];
int nc=c+dc[d];
if(nr>=&&nr< && nc>= &&nc< &&vis[nr][nc]==)
{
if(nr==r2&&nc==c2) return dist[r][c]+;
dist[nr][nc]=+dist[r][c];
Q.push(Node(nr,nc));
vis[nr][nc]=;
}
}
}
return -;
}
int main()
{
char str1[],str2[];
while(scanf("%s%s",str1,str2)==)
{
r1=str1[]-'';
c1=str1[]-'a';
r2=str2[]-'';
c2=str2[]-'a';
printf("To get from %s to %s takes %d knight moves.\n",str1,str2,BFS());
}
return ;
}

DFS:

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

 // DFS
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=;
int r1,c1,r2,c2;
struct Node
{
int r,c;
Node(int r,int c):r(r),c(c){}
};
int vis[maxn][maxn];
int dist[maxn][maxn];
int dr[]={-,-,-,-,,,,};
int dc[]={-,,,-,,-,,-};
int ans;//最终答案
void DFS(int r,int c,int len)
{
if(ans<=len || r< || r>= || c< || c>=) return ;//剪枝
if(r==r2&&c==c2) ans=min(ans,len);
if(vis[r][c]== || dist[r][c]>len)
{
vis[r][c]=;
dist[r][c]=len;
}
else if(vis[r][c]== && len >= dist[r][c] )
return ;
for(int d=;d<;d++)
{
int nr=r+dr[d];
int nc=c+dc[d];
DFS(nr,nc,len+);
}
}
int main()
{
char str1[],str2[];
while(scanf("%s%s",str1,str2)==)
{
r1=str1[]-'';
c1=str1[]-'a';
r2=str2[]-'';
c2=str2[]-'a';
memset(vis,,sizeof(vis));
ans=;
DFS(r1,c1,);
printf("To get from %s to %s takes %d knight moves.\n",str1,str2,ans);
}
return ;
}

A*算法:

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

bfs

 #include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstdio> using namespace std; const int maxn = ; struct Node{
int x,y,step;
int f,g,h;
// g函数为走到当前状态的经过的步数,启发函数h为当前格子到终点横坐标差与纵坐标差的和,用优先队列保存每个状态按照g+h排序
bool operator < (const Node & tmp) const{
return f > tmp.f;
}
}node; bool visd[maxn][maxn];
priority_queue<Node> Que;
int dirs[][]={{-,-},{-,},{,-},{,},{-,-},{-,},{,-},{,}};
int start_x,start_y,end_x,end_y,ans; bool isIN(int x,int y)
{
if(x>=||x<)return false;
if(y>=||y<)return false;
return true;
}
void init()
{
memset(visd,false,sizeof(visd));
while(!Que.empty())Que.pop();
Node S;
S.x=start_x;S.y=start_y;
S.step=;S.g=;S.h=(abs(end_x-start_x)+abs(end_y-start_y))*;
S.f=S.g+S.h;
visd[S.x][S.y]=true;
Que.push(S);
ans=-;
} void Astar()
{
Node A,B;
while(!Que.empty())
{
A=Que.top();Que.pop();
if(A.x==end_x&&A.y==end_y)
{
ans=A.step;
break;
}
for(int i=;i<;i++)
{
int xx=dirs[i][]+A.x;
int yy=dirs[i][]+A.y;
if(isIN(xx,yy)==false||visd[xx][yy])continue;
B.x=xx;B.y=yy;
B.step=A.step+;
B.g=A.g+;
B.h=(abs(end_y-yy)+abs(end_x-xx))*;
B.f=B.g+B.h;
visd[B.x][B.y]=true;
Que.push(B);
}
}
} int main()
{
char line[];
while(gets(line))
{
start_x=line[]-'a';start_y=line[]-'';
end_x=line[]-'a';end_y=line[]-'';
init();
Astar();
printf("To get from %c%c to %c%c takes %d knight moves.\n",line[],line[],line[],line[],ans);
} return ;
}

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. MySQL中binlog参数:binlog_rows_query_log_events-记录具体的SQL【转】

    在使用RBR也就是行格式的时候,去解析binlog,需要逆向才能分析出对应的原始SQL是什么,而且,里面对应的是每一条具体行变更的内容.当然,你可以开启general log,但如果我们需要的只是记录 ...

  2. [转]JS根据useAgent来判断edge, ie, firefox, chrome, opera, safari 等浏览器的类型及版本

    js根据浏览器的useAgent来判断浏览器的类型 userAgent 属性是一个只读的字符串,声明了浏览器用于 HTTP 请求的用户代理头的值. JavaScript语法:navigator.use ...

  3. 030_CORS深究

    在日常的项目开发时会不可避免的需要进行跨域操作,而在实际进行跨域请求时,经常会遇到类似 No 'Access-Control-Allow-Origin' header is present on th ...

  4. Ubuntu选择软件源

    1. 系统桌面右上角,系统菜单中选择Software Up to Date 2. 点击Settings-按钮 3. Ubuntu Software标签页,Download from选择中国的软件服务器 ...

  5. zookeeper的三种安装模式

    zookeeper的安装分为三种模式:单机模式.集群模式和伪集群模式. 1.单机模式 首先,从Apache官网下载一个Zookeeper稳定版本,本次教程采用的是zookeeper-3.4.9版本. ...

  6. 前端 -----函数和伪数组(arguments)

    函数   函数:就是将一些语句进行封装,然后通过调用的形式,执行这些语句. 函数的作用: 将大量重复的语句写在函数里,以后需要这些语句的时候,可以直接调用函数,避免重复劳动. 简化编程,让编程模块化. ...

  7. 【原创】大数据基础之Logstash(1)简介、安装、使用

    Logstash 6.6.2 官方:https://www.elastic.co/products/logstash 一 简介 Centralize, Transform & Stash Yo ...

  8. 38)django-组合搜索

    一:组合搜索 组合搜索可以用来实现快速查询.效果图举例.瓜子网站选车 注意:URL中的地址0-0什么的是传递的参数的值. 二:实现组合搜索 组合实现条件 1)有外键或者多对多多关系 2)有choice ...

  9. 图解Metrics, tracing, and logging

    Logging,Metrics 和 Tracing   最近在看Gophercon大会PPT的时候无意中看到了关于Metrics,Tracing和Logging相关的一篇文章,凑巧这些我基本都接触过, ...

  10. 计算机信息类ComputerInfo(车)

    using System; using System.Management; using System.Net; using System.Net.Sockets; using System.Text ...