牛客小白月赛13 G(双向搜索)
2024-08-24 22:34:58
AC通道
两边同步搜,一步里面A走一次B走两次,遇到对方走过的地方就得到了答案。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1001;
const int tx[] = {-1, 1, 0, 0, -1, -1, 1, 1};
const int ty[] = {0, 0, -1, 1, -1, 1, -1, 1};
int N, M, Ax, Ay, Bx, By;
bool vis[2][maxn][maxn];
char maze[maxn][maxn];
queue<pair<int, int>> Q[2];
bool bfs(int t) {
int control = Q[t].size();
while (control--) {
auto tmp = Q[t].front(); Q[t].pop();
for (int i = 0; i < 8 - 4 * t; i++) {
int x = tmp.first + tx[i];
int y = tmp.second + ty[i];
if (x < 0 || x >= N || y < 0 || y >= M || maze[x][y] == '#')
continue;
if (vis[1 - t][x][y]) return 1;
if (!vis[t][x][y]) Q[t].push({x, y}), vis[t][x][y] = 1;
}
}
return 0;
}
int solve() {
Q[0].push({Ax, Ay});
Q[1].push({Bx, By});
vis[0][Ax][Ay] = 1;
vis[1][Bx][By] = 1;
int step = 0;
while (!Q[0].empty() || !Q[1].empty()) {
step++;
if (bfs(0)) return step;
if (bfs(1)) return step;
if (bfs(1)) return step;
}
return -1;
}
int main() {
scanf("%d %d", &N, &M);
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
getchar();
maze[i][j] = getchar();
if (maze[i][j] == 'C') Ax = i, Ay = j;
if (maze[i][j] == 'D') Bx = i, By = j;
}
}
int ans = solve();
if (ans >= 0) printf("YES\n%d\n", ans);
else puts("NO");
return 0;
}
最新文章
- 六轴加速度传感器MPU6050官方DMP库到瑞萨RL78/G13的移植
- _fastcall
- (C/C++) 基础问答题
- Java 基础-反射
- 换模板,修改了一下css,清新多了~
- vc2008程序发布指南
- 全局变量,extern和static以及命名空间的区别
- Maven第二篇【Idea下使用Maven】
- HTTP协议扫盲(二)HTTP协议的请求方法、请求头和响应头
- 不用局部变量实现C语言两数交换算法
- A - Subarrays Beauty gym 位运算 &;
- hive基础操作—(1)
- XShell 技巧
- 通过RF数据库查询中文字段结果正常显示的转换方法
- 三维dem
- BigDecimal.setScale用法总结
- July 21st 2017 Week 29th Friday
- JVM内存模型 三
- 【Flask】Sqlalchemy group_by having
- New Concept English there (60)
热门文章
- Linux学习之路(二)文件处理命令之上
- listen 68 Theoretical Physicist Stephen Hawking Dies at 76
- 1091 Acute Stroke (30)(30 分)
- Redis 客户端安装与远程连接图解
- Spring管理Filter和Servlet(在servlet中注入spring容器中的bean)
- DS:template
- linux查询内存真是利用率
- Redux API之creatStore
- [hdu3586]Information Disturbing树形dp+二分
- [poj3417]Network(LCA+树形dp)