首页 > 其他分享 >P3638 [APIO2013] 机器人

P3638 [APIO2013] 机器人

时间:2022-09-28 09:45:41浏览次数:84  
标签:return idx int APIO2013 机器人 P3638 ed byte

P3638 APIO2013 机器人

  • 区间DP+最短路处理环形DP
  • 设f[l][r][i]表示合并出编号为[l..r]的机器人(在i号格子)的最少步数
  • 转移: 1.合并机器人 2.用最短路转移:使用两个队列模拟堆
点击查看代码

</details>
#include <stdio.h>
#include <string.h>
#include <algorithm>
typedef signed char byte;
const int inf = 0x3f3f3f3f;
const int N = 502, M = 10, V = N * N, E = N * N * 4;
const byte dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
int c, n, m;
char map[N][N];
int id[N][N], idt; // 对应的编号(映射)
int f[M][M][N * N]; // 合并出编号为[l..r]的机器人(在i号位置)的最少步数
int ed[N][N][4]; // 从(x,y,d)开始最后走到的点的编号,如果为0表示没有遍历过,如果为-1表示在环上
byte in_stk[N][N]; // 是否在栈中
int h[V], e[E], nxt[E], idx;
void add(int a, int b) { e[++ idx] = b, nxt[idx] = h[a], h[a] = idx; }
int dfs(int x, int y, byte d) { // 求出ed
	if(in_stk[x][y] >> d & 1) return ed[x][y][d] = -1;
	if(ed[x][y][d]) return ed[x][y][d];
	in_stk[x][y] |= 1 << d;
	int hx = x + dx[d], hy = y + dy[d];
	if(map[hx][hy] == 'x' || !map[hx][hy]) ed[x][y][d] = id[x][y];
	else if(map[hx][hy] == 'A') ed[x][y][d] = dfs(hx, hy, (d + 3) & 3);
	else if(map[hx][hy] == 'C') ed[x][y][d] = dfs(hx, hy, (d + 1) & 3);
	else ed[x][y][d] = dfs(hx, hy, d);
	in_stk[x][y] ^= 1 << d;
	return ed[x][y][d];
}
int q1[V], q2[E * 4];
int sum[N * N]; // 计数排序
bool st[N * N];
void solve(int *dist) { // 求最短路来转移
	int h1 = 0, t1 = 0, h2 = 0, t2 = 0;
	int maxx = 0; // 先排序
	for(int i = 1; i <= idt; i ++) if(dist[i] < inf) ++ sum[dist[i]], maxx = std::max(maxx, dist[i]);
	for(int i = 1; i <= maxx; i ++) sum[i] += sum[i - 1];
	for(int i = 1; i <= idt; i ++) if(dist[i] < inf) q1[-- sum[dist[i]]] = i, ++ t1, st[i] = true;
	for(int i = 1; i <= maxx; i ++) sum[i] = 0;
	memset(st + 1, 0, idt);
	while(h1 != t1 || h2 != t2) {
		int u = (h1 == t1 ? inf : q1[h1]) < (h2 == t2 ? inf : q2[h2]) ? q1[h1 ++] : q2[h2 ++], d = dist[u] + 1;
		st[u] = false;
		for(int i = h[u], v; i; i = nxt[i])
			dist[v=e[i]] > d && (dist[v] = d, !st[v] && (st[v] = true, q2[t2 ++] = v));
	}
}
int main() {
	scanf("%d%d%d", &c, &m, &n);
	for(int i = 1; i <= n; i ++) {
		scanf("%s", map[i] + 1);
		for(int j = 1; j <= m; j ++) if(map[i][j] != 'x') id[i][j] = ++ idt;
	}
	for(int i = 1; i <= n; i ++)
		for(int j = 1; j <= m; j ++) if(map[i][j] != 'x')
			for(int k = 0; k < 4; k ++)
				if(dfs(i, j, k) != -1 && dfs(i, j, k) != id[i][j])
					add(id[i][j], dfs(i, j, k)); // 从(i,j)出发可到达的点
	for(int i = 1; i <= c; i ++)
		for(int j = 1; j <= c; j ++) memset(f[i][j] + 1, 0x3f, idt << 2);
	for(int i = 1; i <= n; i ++)
		for(int j = 1; j <= m; j ++) if('0' < map[i][j] && map[i][j] <= '9')
			f[map[i][j] - '0'][map[i][j] - '0'][id[i][j]] = 0;
	for(int l = c; l; l --) for(int r = l; r <= c; r ++) {
		for(int k = l; k < r; k ++) for(int i = 1; i <= idt; i ++)
			f[l][r][i] = std::min(f[l][r][i], f[l][k][i] + f[k+1][r][i]); // 合并机器人
		solve(f[l][r]); // 计算最短路(处理机器人被推动的转移)
	}
	int res = inf;
	for(int i = 1; i <= idt; i ++) res = std::min(res, f[1][c][i]);
	printf("%d\n", res >= 0x3f3f3f3f ? -1 : res);
	return 0;
}

标签:return,idx,int,APIO2013,机器人,P3638,ed,byte
From: https://www.cnblogs.com/azzc/p/16736925.html

相关文章

  • 在线客服系统中智能机器人如何应用?
    随着客服系统的更新迭代,客服系统也在慢慢发展,在传统人工客服的基础上增加了智能机器人客服功能。对于客服系统的发展,大家的评价也是褒贬不一,有的人认为传统的人工客服好,也......
  • # 用飞书来谈恋爱,飞书机器人定时给女朋友问好
    目录用飞书来谈恋爱,飞书机器人定时给女朋友问好前言技术要求操作步骤1.两个人用飞书建一个群,添加群机器人2.申请高德地图API3.创建SpringBoot工程,引入Web依赖4.制作飞书卡......
  • 使用 Python 3 开发聊天机器人
    使用Python3开发聊天机器人我最近登陆了一个小项目,使用Python3开发了一个在Telegram平台上使用的聊天机器人。您可以查看机器人帐户@https://t.me/AI_12_Bot.......
  • jenkins发版绑定钉钉机器人报警
    使用场景:每次dev,rls或线上发版时,都能第一时间提醒通知发版的开发测试人员知悉。解决方案:1.在钉钉群里创建钉钉机器人,钉钉群=>  群设置  => 智能群助手  => 添......
  • 使用Geomagic公司遥操作器Touch遥操作UR5e机器人
    应导师要求,给了我一款遥操作器,需要通过该遥操作器来操作UR5e机器人。这款遥操作器Geomagic公司出品的Touch,外型大概长这个样子: 以下是大致思路:使用moveit控制UR5e,同时利......
  • 基于Nonebot2搭建QQ机器人(一)环境配置
    目录Nonebot2搭建流程一、概述1、引言2、框架简介二、go-cqhttp配置三、Nonebot安装1、搭建脚手架2、使用方式3、环境配置4、修改配置文件Nonebot2搭建流程一......
  • 智能机器人系统
    V0.2版本更新内容获取当前人员顺序接口增加自定义假期的接口增加了设定开始人员接口增加了人员交换接口获取人员顺序方式get路由/getOrder结果返回人员顺序......
  • 《概率机器人》课后习题 第3章
    importnumpyasnpimportmatplotlib.pyplotaspltfrommatplotlib.patchesimportEllipsefrommatplotlib.patchesimportCircle第一题第1问为了方便,把状态记......
  • 读《概率机器人》第三章
    § 1卡尔曼滤波KF概述自己总结:基础的卡尔曼滤波完成了这样的一件事:在一系列线性的前提条件下,在状态转移模型具有正态分布、测量模型具有正态分布的情况下,给出了一个满......
  • 五分钟实现Zabbix电话短信机器人报警
    Zabbix是现在企业用的比较多的开源监控系统,Zabbix电话短信报警更是运维不可缺少的报警渠道,假如半夜正在睡觉服务器异常了,这时候电话报警就非常必要。Spug推送助手针对......