博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Knight Moves (双向bfs)
阅读量:5246 次
发布时间:2019-06-14

本文共 1315 字,大约阅读时间需要 4 分钟。

【题目描述】

编写一个程序,计算一个骑士从棋盘上的一个格子到另一个格子所需的最小步数。骑士一步可以移动到的位置由下图给出。

Picture 1

【算法】

双向bfs优先扩展节点数少的队列。什么破东西速度没快多少啊。。。。

【代码】

#include 
#include
#define P pair
#define ff first#define ss secondusing namespace std;int T,ans,L;int d[310][310][2];const int dx[8]={-2,-1,1,2,2,1,-1,-2},dy[8]={1,2,2,1,-1,-2,-2,-1};queue

q[2];bool work(int x,queue

& q) { P now=q.front(); q.pop(); for(int i=0;i<8;i++) { int nx=now.ff+dx[i],ny=now.ss+dy[i]; if(nx>=1&&nx<=L&&ny>=1&&ny<=L&&d[nx][ny][x]==-1) { d[nx][ny][x]=d[now.ff][now.ss][x]+1; if(d[now.ff][now.ss][x^1]!=-1) { ans=d[now.ff][now.ss][0]+d[now.ff][now.ss][1]; return 1; } q.push(make_pair(nx,ny)); } } return 0;}int main() { scanf("%d",&T); while(T--) { scanf("%d",&L); P x; scanf("%d%d",&x.ff,&x.ss); x.ff++,x.ss++; P y; scanf("%d%d",&y.ff,&y.ss); y.ff++,y.ss++; for(int i=1;i<=L;i++) for(int j=1;j<=L;j++) d[i][j][0]=d[i][j][1]=-1; queue

q[2]; q[0].push(x),d[x.ff][x.ss][0]=0; q[1].push(y),d[y.ff][y.ss][1]=0; while(q[0].size()&&q[1].size()) { if(q[0].size()

转载于:https://www.cnblogs.com/Willendless/p/9581576.html

你可能感兴趣的文章
Tensorflow - tf常用函数使用(持续更新中)
查看>>
Ubuntu18.04下无法进入图形界面、无法调整分辨率、无法重装显卡驱动问题的解决方式...
查看>>
计算器
查看>>
java
查看>>
hive函数 get_json_object
查看>>
regexp_replace
查看>>
用PMML实现python机器学习模型的跨平台上线
查看>>
Sql中substr的使用
查看>>
oracle中nvl()函数
查看>>
Hive安装与配置详解
查看>>
unix_timestamp 时间戳函数用法(hive)
查看>>
累积分布函数(cumulative distribution function)
查看>>
ROC曲线 VS PR曲线
查看>>
MySQL DATE_SUB() 函数
查看>>
CatBoost使用GPU实现决策树的快速梯度提升CatBoost Enables Fast Gradient Boosting on Decision Trees Using GPUs...
查看>>
信息量_熵_条件熵_相对熵_交叉熵_互信息_信息增益_信息增益比
查看>>
对数损失函数logloss详解和python代码
查看>>
kappa系数
查看>>
pandas.merge数据连接合并
查看>>
pandas.DataFrame.sample随机抽样
查看>>