2018ICPC焦作 F. Honeycomb /// BFS
2024-09-30 23:27:36
题目大意:
给定n m表示一共n行每行m个蜂巢
求从S到T的最短路径
input
1
3 4
+---+ +---+
/ \ / \
+ +---+ +---+
\ \ / \
+ + S +---+ T +
/ \ / /
+ +---+ + +
\ \ / \
+---+ +---+ +
/ /
+ +---+ + +
\ / \
+---+ +---+ +
\ / \ /
+---+ +---+
output
7
如图所示,其实只要按平常的走迷宫改变一下位移的格数就行了
改成一下的 上,下,左上,右上,左下,右下 的位移格数
如下位移格数,移动后为墙所在的位置,判断有没有墙即可判断能不能通过
int mov[][]={ {-,},{,},
{-,-},{-,},
{,-},{,} };
然后将每个蜂巢的中心点当做固定点,即要到达这个蜂巢就将坐标定位在这个蜂巢的中心点
这样就会发现,两个中心点的距离其实就是两倍位移格数
这个思路很好写 场上想复杂了 直接带偏队友思路 引以为戒a...
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int N=1e4+;
char G[N][N];
int n,m,stx,sty;
int mov[][]={ {-,},{,},
{-,-},{-,},
{,-},{,} };
struct NODE { int x,y,l; };
int bfs() {
queue <NODE> q;
q.push((NODE){stx,sty,});
while(!q.empty()) {
NODE e=q.front(); q.pop();
for(int i=;i<;i++) {
int x1=e.x+mov[i][];
int y1=e.y+mov[i][];
int x2=x1+mov[i][];
int y2=y1+mov[i][];
if(G[x1][y1]==' ' && G[x2][y2]=='T') return e.l+;
if(G[x1][y1]!=' ' || G[x2][y2]!=' ') continue;
G[x2][y2]='#';
q.push((NODE){x2,y2,e.l+});
}
}
return INF;
}
int main()
{
int t; scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
getchar();
n=n*+, m=m*+;
for(int i=;i<=n;i++) {
char ch; G[i][]=' '; int j=;
while(~scanf("%c",&ch)&&ch!='\n') {
G[i][j]=ch;
if(ch=='S') stx=i,sty=j;
j++;
} G[i][j]='\0';
}
int ans=bfs();
if(ans==INF) printf("-1\n");
else printf("%d\n",ans);
} return ;
}
最新文章
- thinkphp - 复合查询(or、and 联合使用的方法)
- Bootstrap响应式栅格系统的设计原理
- 装完RHEL7后,重新开机启动后显示:Initial setup of CentOS Linux 7 (core) 提示license报错
- C#中的 序列化和反序列化
- windows下的vimrc
- c++ 程序崩溃生成Dump文件
- 异常:android.os.NetworkOnMainThreadException
- RF:RF实现根据乳腺肿瘤特征向量高精度(better)预测肿瘤的是恶性还是良性—Jason niu
- laravel中及其常用的一些函数方法(自己看)和技巧(不断添加中)
- MG90S 舵机 使用方法 树莓派
- TexStudio + TexLive 修改字体大小
- [视频]K8飞刀 mysql注入点拿shell &; UDF提权教程
- centos7.2 开机启动脚本
- spring mvc 常见错误
- pandas数据处理攻略
- Django(request和response)
- 用python将MSCOCO和Caltech行人检测数据集转化成VOC格式
- php文件的处理和操作
- 【大数据系列】hadoop集群的配置
- [mysql] mysql如何实现更新一条记录中某个字段值的一部分呢?