https://ac.nowcoder.com/acm/contest/318/H

C++版本一
题解:直接bfs,对每个状态记录一下他收集了那些快乐水。记录状态有一个小技巧,二进制压缩记录状态。(自己百度状压去)用3位二进制数记录你获得了那些快乐水。栗子:000表示你有0瓶快乐水,001表示你有第一瓶快乐水,110表示你有第二,三瓶快乐水,依次类推。一共有8个状态0-7,用vis[state][x][y]表示你从起点到达(x,y)位置且状态为sta的最小消耗。注意,当你经过快乐水的节点你可以选择捡起或不捡起来。
Ps:细节见代码,当然自己补题更好。

#include<bits/stdc++.h>
#define mme(a,b) memset((a),(b),sizeof((a)))
#define fuck(x) cout<<"* "<<x<<"\n"
using namespace std;
typedef long long LL;
const int N = 1e2 + 7;
const int INF = 0x3f3f3f3f;
struct lp {int x, y, num, step;
} AA, BB;
int n, m, ans;
char ar[N][N];
int dir[4][2] = {1,0,0,1,-1,0,0,-1};
int vis[N][N][8];
int sx, sy, ex, ey;
int kx[4], ky[4], cost[4];
inline int get_num(int x, int y) {for(int i = 1; i <= 3; ++i) if(x == kx[i] && y == ky[i]) return i;return -1;
}
inline int get_cost(int num) {int ans = 0;for(int i = 0; i < 3; ++i) if(num & (1 << i))ans = max(ans, cost[i + 1]);return ans;
}
void bfs() {for(int i = 1; i <= n; ++i) for(int j = 1; j <= m; ++j) for(int k = 0; k <= 7; ++k)vis[i][j][k] = INF;queue<lp> Q;AA.x = sx, AA.y = sy, AA.num = 0;AA.step = 0;Q.push(AA);vis[sx][sy][0] = 0;while(!Q.empty()) {AA = Q.front(); Q.pop();if(AA.x == ex && AA.y == ey && AA.num == 7) {ans = min(AA.step, ans);continue;}int cc = get_cost(AA.num);//printf("x = %d y = %d step = %d num = %d\n\n", AA.x, AA.y, AA.step, AA.num);for(int i = 0; i < 4; ++i) {int px = AA.x + dir[i][0];int py = AA.y + dir[i][1];if(px <= 0 || py <= 0 || px > n || py > m) continue;if(ar[px][py] == '#' && AA.num == 7) continue;BB.step = AA.step + cc + 1;if(BB.step >= vis[px][py][AA.num]) continue;BB.x = px, BB.y = py;BB.num = AA.num;vis[px][py][BB.num] = BB.step;Q.push(BB);int key_num = get_num(px, py);if(key_num != -1 && ((BB.num&(1<<(key_num-1))) == 0)) {BB.num |= (1 << (key_num-1));if(BB.step >= vis[px][py][BB.num]) continue;vis[px][py][BB.num] = BB.step;Q.push(BB);}}}
}
int main() {
#ifndef ONLINE_JUDGEfreopen("E://A//shuju//5.in", "r", stdin);freopen("E://A//shuju//5.out", "w", stdout);
#endifint tim;scanf("%d", &tim);while(tim --) {scanf("%d%d", &n, &m);for(int i = 1; i <= n; ++i) {scanf("%s", ar[i] + 1);for(int j = 1; j <= m; ++j) {if(ar[i][j] == 'S') sx = i, sy = j;if(ar[i][j] == 'E') ex = i, ey = j;if(ar[i][j] == 'X') kx[1] = i, ky[1] = j;if(ar[i][j] == 'Y') kx[2] = i, ky[2] = j;if(ar[i][j] == 'Z') kx[3] = i, ky[3] = j;}}for(int i = 1; i <= 3; ++i) scanf("%d", &cost[i]);ans = INF;bfs();printf("%d\n", ans);}return 0;
}

C++版本二
题解:注意到题目说的当你没有集齐所有快乐水的每次移动花费为1.所以你可以预处理出S,X,Y,Z四点之间的曼哈顿距离。然后终点以满的花费跑一次有障碍物的普通bfs,记录到X,Y,Z的最小体力花费。然后枚举一遍X,Y,Z的收集顺序,选取最优解即可。此方法效率更高。

#include <bits/stdc++.h>
#define lson l,mid,rt<<1
#define rson mid+1,r,(rt<<1)+1
#define CLR(x,y) memset((x),y,sizeof(x))
#define fuck(x) cerr << #x << "=" << x << endl
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 5;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
int  T, n, m, sx, sy, lx, ly, ax, bx, cx, ay, by, cy, a, b, c;
char mp[105][105];
int dis[105][105];
bool vis[105][105];
int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};
int p[5] = {1, 2, 3};
struct Node {int x, y, val;
} e[5];
struct node {int x, y, stp;node() {}node(int x, int y, int stp): x(x), y(y), stp(stp) {}
};
bool ok(int x, int y) {if (x < 1 || y < 1 || x > n || y > m) return 0;else return 1;
}
void bfs(int cost) {CLR(vis, 0);CLR(dis, 0x3f);dis[lx][ly] = 0;vis[lx][ly] = 1;queue<node> que;que.push(node(lx, ly, 0));while (!que.empty()) {node tmp = que.front(); que.pop();dis[tmp.x][tmp.y] = tmp.stp;for (int i = 0; i < 4; i++) {int dx = tmp.x + dir[i][0];int dy = tmp.y + dir[i][1];if (!ok(dx, dy)) continue;if (mp[dx][dy] == '#' || vis[dx][dy]) continue;vis[dx][dy] = 1;que.push(node(dx, dy, tmp.stp + cost));}}
}
int calc(int x1, int y1, int x2, int y2) {return abs(x1 - x2) + abs(y1 - y2);
}
int main() {scanf("%d", &T);while (T--) {scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++) scanf("%s", mp[i] + 1);int tmp = 0;for (int i = 1, x; i <= 3; i++)  scanf("%d", &e[i].val), tmp = max(tmp, e[i].val);for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (mp[i][j] == 'S') {sx = i;sy = j;}else if (mp[i][j] == 'E') {lx = i;ly = j;}else if (mp[i][j] == 'X') {e[1].x = i;e[1].y = j;}else if (mp[i][j] == 'Y') {e[2].x = i;e[2].y = j;}else if (mp[i][j] == 'Z') {e[3].x = i;e[3].y = j;}}}bfs(tmp+1);int min_ans = INF;for(int i = 1; i <= 3; ++i) p[i] = i;do {/*for(int i = 1; i <= 3; ++i) printf("%d ", p[i]);printf("\n");*/int sum = dis[e[p[3]].x][e[p[3]].y];sum += calc(sx, sy, e[p[1]].x, e[p[1]].y);tmp = 0;for(int i = 1; i <= 2; ++i) {tmp = max(tmp, e[p[i]].val);sum += (tmp+1)*calc(e[p[i]].x, e[p[i]].y, e[p[i + 1]].x, e[p[i + 1]].y);}min_ans = min(min_ans, sum);} while (next_permutation(p + 1, p + 4));printf("%d\n", min_ans);}return 0;
}

C++版本三

#include "bits/stdc++.h"
using namespace std;
const int dir[4][2] = {-1,0,0,-1,0,1,1,0};
int N, M, sx, sy, ans, a[5];
bool che(int x, int y)
{return x>=1 && y>=1 && x<=N && y<=M;
}
char mp[105][105];
bool vis[105][105][10];
struct node
{int x ,y, state, speed, t;node(int a=0, int b=0, int c=0, int d=0, int tt=0):x(a), y(b), state(c), speed(d), t(tt) {}friend bool operator < (node e1, node e2) { return e1.t > e2.t; }
};
void bfs()
{memset(vis, false, sizeof(vis));priority_queue<node> Q;Q.push(node(sx,sy,0,0,0));vis[sx][sy][0] = true;while(!Q.empty()){node tmp = Q.top(); Q.pop();for(int i=0; i<4; i++){int xx = tmp.x + dir[i][0], yy = tmp.y + dir[i][1];if(!che(xx, yy) || (tmp.state == 7 && mp[xx][yy] == '#')) continue;if(mp[xx][yy] == 'E'){if(tmp.state == 7) { ans = tmp.t + tmp.speed + 1; return; }if(vis[xx][yy][tmp.state]) continue;vis[xx][yy][tmp.state] = true;Q.push(node(xx, yy, tmp.state, tmp.speed, tmp.t + tmp.speed + 1));}else if(mp[xx][yy]>='X' && mp[xx][yy]<='Z'){int id = (mp[xx][yy] - 'X');if( (tmp.state>>id) & 1){if(vis[xx][yy][tmp.state]) continue;vis[xx][yy][tmp.state] = true;Q.push(node(xx, yy, tmp.state, tmp.speed, tmp.t + tmp.speed + 1));}else{if(!vis[xx][yy][tmp.state]){vis[xx][yy][tmp.state] = true;Q.push(node(xx, yy, tmp.state, tmp.speed, tmp.t + tmp.speed + 1));}int state = (tmp.state | (1<<id)), speed = max(tmp.speed, a[id]);vis[xx][yy][state] = true;Q.push(node(xx, yy, state, speed, tmp.t + tmp.speed + 1));}}else{if(vis[xx][yy][tmp.state]) continue;vis[xx][yy][tmp.state] = true;Q.push(node(xx, yy, tmp.state, tmp.speed, tmp.t + tmp.speed + 1));}}}
}
int main()
{int T;  scanf("%d", &T);while(T--){scanf("%d%d", &N, &M);for(int i=1; i<=N; i++){scanf("%s", mp[i]+1);for(int j=1; j<=M; j++){if(mp[i][j] == 'S'){sx = i;sy = j;mp[i][j] = '.';}}}scanf("%d%d%d", &a[0], &a[1], &a[2]);//ans = INF;bfs();printf("%d\n", ans);}return 0;
}

huizhang要约会相关推荐

  1. 男人约会动机大揭秘。

    被人约是好事,但也要眼明心亮,男人约会动机大揭秘. 男人约会动机大揭秘: 1:这是一个有诚意的开始,表明他是早有计划和你约会的.至少,也说明他有相当的社交礼貌. 2:这个男人可能只是一时寂寞了,如果你 ...

  2. 【PAT (Basic Level) 】1014 福尔摩斯的约会 (20 分)

    大侦探福尔摩斯接到一张奇怪的字条: 我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm 大侦探很快就明白了,字条上 ...

  3. VS Code竟然能约会,找对象不看脸,看编程水平

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI VS Code现在居然可以用来谈恋爱了. 为了用最硬核的方式找到男(女)朋友,23岁的程序员Ben Awad在VS Code里打造一个约会 ...

  4. 怎么主动发起话题_约会的时候,多聊这4个话题,女人才会失去抵抗力

    约会就意味着跟女人在足够短的距离配合足够短的时间进行短兵相接,唯有用你的三寸不烂之舌才能够做到不战,照样能够旗开得胜,说服女人就是从内部攻破女人的防线. 一.女人想要的未来在哪里,你就需要跟女人聊到哪 ...

  5. 2021年了,为什么约会软件算法仍然如此糟糕?

    来源:大数据文摘本文约2000字,建议阅读5分钟在爱情中,就像在其他任何事情中一样,幸运偏爱勇敢的人. 疫情期间,约会软件迎来了爆发期. 但随着社会的再次放开,仍然有越来越多的单身人士选择线上软件.根 ...

  6. “新视野”和“最远点”的约会

    NASA 设想的2014 MU69 太空岩石 来源:中国科学报 当新年香槟将陌生人聚在一起时,一种不同的聚会正在外太阳系进行.在距地球近65亿公里的地方,美国宇航局(NASA)"新视野&qu ...

  7. P1516 青蛙的约会 [exgcd]

    P1516 青蛙的约会 题意:在一个长为\(l\)的环上面有两只青蛙,一只出发点为\(x\),一次跳\(m\),另一只出发点为\(y\),一次跳\(n\),求相遇时间. 这个长为\(l\)的环不难想到 ...

  8. OSChina 周一乱弹 —— 还一星期就要和女神约会了

    2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2018)请戳(这里) [今日歌曲] @胖达panda :分享Lenka的单曲<The Long Way ...

  9. pb 里面有个report object_【园所新闻】我们与秋天有个“约会” ——记区一实幼尧佳园亲子秋游活动...

    我们与秋天有个"约会" --记区一实幼尧佳园亲子秋游活动 秋天的枝头硕果累累,秋天的树叶色彩缤纷,秋天正张开臂膀等着孩子们,进行一场快乐的"约会".为了这场&q ...

最新文章

  1. iOS SDK:iOS调试技巧
  2. C语言 | 基于MPU605(六轴传感器)的I2C实现LCD1602显示(代码类)
  3. ubuntu nfs
  4. 【数据结构与算法】之深入解析“把二叉搜索树转换为累加树”和“从二叉搜索树到更大和树”的求解思路与算法示例
  5. Linux文件系统为,浅析Linux文件系统
  6. SQL Server 数据库管理常用的SQL和T-SQL语句
  7. 再不懂ZooKeeper,就安安心心把这篇文章看完
  8. 百度前端学院参考答案:第二十五天到第二十七天 倒数开始 滴答滴 滴答滴(2)...
  9. 基于SpringMVC+EasyPoi,采用Excel模板方式实现Excel在线预览和导出(2021版)
  10. java ocr linux_linux系统如何使用tess4j(java)进行ocr图片文字识别
  11. go https 笔记
  12. 贺利坚老师汇编课程26笔记:LOOP指令使用再议
  13. java文件删除操作_Java文件复制删除操作合集
  14. VS2015sql本地服务器为空,详解VS2015自带LocalDB数据库用法实例
  15. DC-DC LLC转换器 matlab simulink仿真显示了一个DC-DC LLC功率转换器与频率控制
  16. 线性代数————思维导图(上岸必备)(矩阵部分)
  17. 【系统分析师之路】原创章节 非功能需求设计思维导图
  18. C语言中的数组(4)---二维数组的定义
  19. Hexo之NexT主题设置背景图片
  20. win7计算机管理无用户账户,win7系统右键没有以管理员身份运行解决方法

热门文章

  1. jquery ajax html方法吗,jQuery ajax方法
  2. python列表常用方法_第24p,必须掌握,列表的常用方法
  3. linux是基于什么的软件模式进行发布的,《Linux操作系统与应用项目教程》习题.doc...
  4. CaSS中lisp命令不可用_小白想要自学南方cass?又苦于不会修改比例尺,这里有一份小白快速上手的测绘神器...
  5. form select multiple 某个字段是数组_Hive取非Group by字段数据的方法
  6. 二十四、深入Python多进程multiprocessing模块
  7. 期末考试前的预习,科目:化工设备与反应器(5)
  8. 八十五、Eureka搭建分布式SpringCloud项目
  9. 开箱即用!这个神器,拯救了无数算法工程师……
  10. 从动力学角度看优化算法:自适应学习率算法