P3855 [TJOI2008]Binary Land
难度:4
知识点:广度优先搜索
又解决一道,这道题首先状态很好想,就是一个四维数组,两个点的坐标共四个数来组成一个状态,起点状态终点状态也显而易见,然后是蜘蛛网,这个东西有点迷惑性,题目说的是如果踩了就失败,其实这玩意儿就是个路障,和障碍一样,你碰到了不走,就行,没有说非要你遇见了就去走,然后就是本题最难的一个点了,两个点的移动,
题目说了两个点是一起移动,如果其中一个点遇到了障碍,那么可以不动,只移动另外一个点,言外之意就是假如两个点都能移动的时候必须两个点都要移动,不能两个点都能移动的时候只移动其中一个,我一开始就是这个点没想到做错的,写了一个12维的增量数组,所以四个方向,每个方向三种情况,看似是12种,其实每个方向只有一种选择,要么两个都移动,要么移动其中一个,最后最多还是四种情况,每种情况都是每个方向上三选一,这个想明白了,题目里面说的退回操作就很好写了,
#include <bits/stdc++.h>#define fi first
#define se second
#define pb push_back
#define mk make_pair
#define sz(x) ((int) x.size())
#define all(x) (x).begin(), (x).end()using namespace std;typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;const int N = 35;int n, m, xm, ym, xg, yg, xt, yt;
int dx1[4] = {-1, 0, 1, 0}, dy1[4] = {0, 1, 0, -1};
int dx2[4] = {-1, 0, 1, 0}, dy2[4] = {0, -1, 0, 1};
string s[N];void bfs() {queue<pair<pa, pa> > q;q.push(mk(mk(xm, ym), mk(xg, yg)));int dist[N][N][N][N];fill((int*) dist, (int*) dist + N * N * N * N, -1);dist[xm][ym][xg][yg] = 0;while (!q.empty()) {pair<pa, pa> now = q.front(); q.pop();if (now == mk(mk(xt, yt), mk(xt, yt))) { cout << dist[xt][yt][xt][yt]; return; }for (int i = 0; i < 4; i++) {int x1 = now.fi.fi + dx1[i], y1 = now.fi.se + dy1[i];int x2 = now.se.fi + dx2[i], y2 = now.se.se + dy2[i];if (x1 < 0 || y1 < 0 || x1 >= n || y1 >= m) continue;if (x2 < 0 || y2 < 0 || x2 >= n || y2 >= m) continue;if (s[x1][y1] == '#' && s[x2][y2] == '#') continue;if (s[x1][y1] == '#') x1 -= dx1[i], y1 -= dy1[i];if (s[x2][y2] == '#') x2 -= dx2[i], y2 -= dy2[i];if (dist[x1][y1][x2][y2] > -1 || s[x1][y1] == 'X' || s[x2][y2] == 'X') continue;q.push(mk(mk(x1, y1), mk(x2, y2)));dist[x1][y1][x2][y2] = dist[now.fi.fi][now.fi.se][now.se.fi][now.se.se] + 1;}}cout << "no";
}int main() {cin >> n >> m;for (int i = 0; i < n; i++) {cin >> s[i];for (int j = 0; j < m; j++) {if (s[i][j] == 'G') { xg = i; yg = j; s[i][j] = '.'; }if (s[i][j] == 'M') { xm = i; ym = j; s[i][j] = '.'; }if (s[i][j] == 'T') { xt = i; yt = j; s[i][j] = '.'; }}}bfs();return 0;
}
P3855 [TJOI2008]Binary Land相关推荐
- [KSN2021] Binary Land
题目链接:[KSN2021] Binary Land 我们可以发现,如果一个数字最高位之后有一个0,那么是可以连向某个对应位置最高位为1的数字. 然后这个不难想到可以对每一个二进制位建立虚点. 我们发 ...
- [KSN2021] Binary Land题解(位运算应用)
P7973 [KSN2021] Binary Land [KSN2021] Binary Land 题目描述 给定一张 N N N 个点的图,每个点有权值 A i A_i Ai 和价值 B i B_ ...
- 【HDU - 5050 】Divided Land (Java大数,大数进制转换,大数gcd)
题干: It's time to fight the local despots and redistribute the land. There is a rectangular piece of ...
- HDU 5050 Divided Land (二进制上的最大公约数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5050 题面: Divided Land Time Limit: 8000/4000 MS (Java/ ...
- 107. Binary Tree Level Order Traversal II
题目 Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from l ...
- 102. Binary Tree Level Order Traversal
题目 Binary Tree Level Order Traversal 层次遍历二叉树 链接 Given a binary tree, return the level order traversa ...
- Binary XML file line #8: Error inflating class android.support.v7.widget.RecyclerView
今天创建了一个 demo ,然后就是复制RecyclerView 过去, 到最后完成运行的时候发现 系统奔溃了, 然后 提示 Binary XML file line #8: Error inflat ...
- Android运行时候报错:android.view.InflateException: Binary XML file line #19: Binary XML file lin
Android运行时候报错:android.view.InflateException: Binary XML file line #19: Binary XML file lin 这个问题自己大致在 ...
- android.view.InflateException: Binary XML file line #7: Binary XML file line #7
错误如下 11-21 08:19:44.040 3608-3608/com.leon.oldrecyclerview E/AndroidRuntime: FATAL EXCEPTION: main ...
最新文章
- fzu - Problem 1759 Super A^B mod C
- 服务器开发设计之算法宝典
- 汇编语言(二十五)之成绩分段统计
- QT Core | 信号槽02 - GUI上按钮触发应用程序的函数(lambda表达式)
- 【补丁分析】CVE-2016-8610:对导致拒绝服务的“SSL Death Alert”漏洞补丁分析
- jQuery中each的用法之退出循环和结束本次循环
- 学完Linux之后学什么语言,学习C语言一段时间后我们能做什么?
- mysql8.x非注册使用[{绿色使用]
- if判断与while、for循环语句
- SAP中计划策略11测试
- 淘宝商品数据爬取并分析数据
- 给出n元置换群线性表示的一种方法
- ]计算机专业就业方向 .
- 奇数位升序偶数位降序链表排序
- 大数据应用“情感趋同现象”伦理风险问题刍议
- 本以为java语言很难学,其实就学完下面这些知识,就能理解了
- 计算机科学与技术考研辅导班,[独峰考研]清华大学计算机科学与技术考研辅导班-清华计算机系考研经验真题...
- GB(国标)字典大全
- AutoCAD 2014 新特性概览
- php apc 502,【案例】小心,apc可能导致php-fpm罢工!