当前位置: 首页 > news >正文

诱人888网站/那个推广平台好用

诱人888网站,那个推广平台好用,高端网站建设公司排行,青海项目信息网题目链接 首先拆点,把每个点拆成4个点,表示到达这个点的时候赛车的朝向。 然后考虑连边。 相邻同向并且都是可以走的点直接连边权1的边。 至于怎么转向,只需在每个点\(i\)向每个方向一直拓展直到不能走为止,如果当前点的深度大于灵…

题目链接
首先拆点,把每个点拆成4个点,表示到达这个点的时候赛车的朝向。
然后考虑连边。
相邻同向并且都是可以走的点直接连边权1的边。
至于怎么转向,只需在每个点\(i\)向每个方向一直拓展直到不能走为止,如果当前点的深度大于灵敏度,从\(i\)向这个点的其它3个方向都连一条边权为这个点的深度的边。
然后跑\(SPFA\)(至于为什么是\(SPFA\)我才不会告诉你是博主懒),这样你可以获得\(90pts\)
为什么?因为我们最多要跑\(10\)次,而每次连边的时间复杂度都是\(O(n^3)\)级别的,加上要跑\(SPFA\),很容易超时。
所以考虑一个优化,显然每次连边有很多重复的地方,因为灵敏度为\(2\)的情况肯定也把灵敏度为\(3\)的情况的所有边都连了。
所以我们不妨反过来跑,灵敏度从\(10\)\(1\),每次只连长度刚好为灵敏度的转向边,用栈记录一下答案就行了。

\(90pts\)

#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#define Open(s) freopen(s".in","r",stdin); freopen(s".out","w",stdout);
#define Close fclose(stdin); fclose(stdout);
#define O(x) cout << #x << "=" << x << endl;
using namespace std;
const int MAXN = 10010 << 2;
const int MAXM = 5000000;
struct Edge{int next, to, dis;
}e[MAXM << 1];
int head[MAXN], num, dis[MAXN], vis[MAXN], a[110][110];
inline void Add(int u, int v, int dis){e[++num] = (Edge){ head[u], v, dis }; head[u] = num;
}
int n, m, N, l[] = { -1, 1, 0, 0 }, r[] = { 0, 0, -1, 1 }, sx, sy, px, py;
inline int id(int x, int y, int direct){return direct * N + (x - 1) * m + y;
}
queue <int> q;
int work(int check){num = 0; memset(head, 0, sizeof head);memset(dis, 127, sizeof dis);for(int i = 1; i <= n; ++i)for(int j = 1; j <= m; ++j){if(!a[i][j]) continue;for(int k = 0; k < 4; ++k){int x = i + l[k], y = j + r[k];if(!a[x][y]) continue;Add(id(i, j, k), id(x, y, k), 1);for(int o = 1; a[x][y]; x += l[k], y += r[k], ++o)if(o >= check)for(int l = 0; l < 4; ++l)if(l != k)Add(id(i, j, k), id(x, y, l), o);}}dis[id(sx, sy, 0)] = dis[id(sx, sy, 1)] = dis[id(sx, sy, 2)] = dis[id(sx, sy, 3)] = 0;vis[id(sx, sy, 0)] = vis[id(sx, sy, 1)] = vis[id(sx, sy, 2)] = vis[id(sx, sy, 3)] = 1;q.push(id(sx, sy, 0)); q.push(id(sx, sy, 1)); q.push(id(sx, sy, 2)); q.push(id(sx, sy, 3));while(q.size()){int u = q.front(); q.pop();vis[u] = 0;for(int i = head[u]; i; i = e[i].next)if(dis[e[i].to] > dis[u] + e[i].dis){dis[e[i].to] = dis[u] + e[i].dis;if(!vis[e[i].to]){vis[e[i].to] = 1;q.push(e[i].to);}}}int ans = min(min(dis[id(px, py, 0)], dis[id(px, py, 1)]), min(dis[id(px, py, 2)], dis[id(px, py, 3)]));if(ans < 10000000) return printf("%d %d\n", check, ans), 0;else return 1;
}
int main(){scanf("%d%d%d%d%d%d", &n, &m, &sx, &sy, &px, &py); N = n * m;for(int i = 1; i <= n; ++i)for(int j = 1; j <= m; ++j)scanf("%d", &a[i][j]);for(int i = 1; i <= 10; ++i)if(work(i))break;return 0;
}

\(100pts\)

#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#define Open(s) freopen(s".in","r",stdin); freopen(s".out","w",stdout);
#define Close fclose(stdin); fclose(stdout);
#define O(x) cout << #x << "=" << x << endl;
using namespace std;
const int MAXN = 10010 << 2;
const int MAXM = 5000000;
struct Edge{int next, to, dis;
}e[MAXM << 1];
int head[MAXN], num, dis[MAXN], vis[MAXN], a[110][110], s[12], top;
inline void Add(int u, int v, int dis){e[++num] = (Edge){ head[u], v, dis }; head[u] = num;
}
int n, m, N, l[] = { -1, 1, 0, 0 }, r[] = { 0, 0, -1, 1 }, sx, sy, px, py;
inline int id(int x, int y, int direct){return direct * N + (x - 1) * m + y;
}
queue <int> q;
void work(int check){for(int i = 1; i <= n; ++i)for(int j = 1; j <= m; ++j){if(!a[i][j]) continue;for(int k = 0; k < 4; ++k){for(int p = 1, x = i + l[k], y = j + r[k]; a[x][y]; ++p, x += l[k], y += r[k])if(p == check){for(int l = 0; l < 4; ++l)if(l != k)Add(id(i, j, k), id(x, y, l), check);break;}}}memset(dis, 127, sizeof dis);dis[id(sx, sy, 0)] = dis[id(sx, sy, 1)] = dis[id(sx, sy, 2)] = dis[id(sx, sy, 3)] = 0;vis[id(sx, sy, 0)] = vis[id(sx, sy, 1)] = vis[id(sx, sy, 2)] = vis[id(sx, sy, 3)] = 1;q.push(id(sx, sy, 0)); q.push(id(sx, sy, 1)); q.push(id(sx, sy, 2)); q.push(id(sx, sy, 3));while(q.size()){int u = q.front(); q.pop();vis[u] = 0;for(int i = head[u]; i; i = e[i].next)if(dis[e[i].to] > dis[u] + e[i].dis){dis[e[i].to] = dis[u] + e[i].dis;if(!vis[e[i].to]){vis[e[i].to] = 1;q.push(e[i].to);}}}int ans = min(min(dis[id(px, py, 0)], dis[id(px, py, 1)]), min(dis[id(px, py, 2)], dis[id(px, py, 3)]));if(ans < 10000000) s[++top] = ans;
}
int main(){scanf("%d%d%d%d%d%d", &n, &m, &sx, &sy, &px, &py); N = n * m;for(int i = 1; i <= n; ++i)for(int j = 1; j <= m; ++j)scanf("%d", &a[i][j]);for(int i = 1; i <= n; ++i)for(int j = 1; j <= m; ++j){if(!a[i][j]) continue;for(int k = 0; k < 4; ++k){int x = i + l[k], y = j + r[k];if(!a[x][y]) continue;Add(id(i, j, k), id(x, y, k), 1);}}for(int i = 10; i; --i)work(i);for(int Top = top, i = 1; i <= Top; ++i)printf("%d %d\n", i, s[top--]);return 0;
}

转载于:https://www.cnblogs.com/Qihoo360/p/11019262.html

http://www.lbrq.cn/news/1287397.html

相关文章:

  • 华为公司网站建设目标/网站优化的方式有哪些
  • 网站素材模板旅游/搜索软件
  • 网站设计团队/微信小程序怎么开通
  • 外贸网站建站m/优化设计答案六年级
  • 眼镜东莞网站建设/旅游产品推广有哪些渠道
  • 官方网站、门户网站是什么意思?/好的竞价账户托管外包
  • 电子商务网站建设 价格/快速优化seo
  • 做快递单的网站会不会是骗人的/网络营销的主要内容包括
  • 襄阳做网站价格/全网网络营销推广
  • php动态网站开发案例答案第二章/管理方面的培训课程
  • 普洱住房和城乡建设委员会网站/武汉seo网站优化运营
  • 临沂网站建设培训学校/html网页制作
  • 吉林商城网站建设/广州网站优化软件
  • 免费做网站教程/怎么推广销售
  • 河南建网站/抖音怎么运营和引流
  • 通过企业画册宣传_网络网站建设_新闻媒体合作等方式_/福州网站建设策划
  • 响应式网站的排版/网站搜索优化官网
  • 网站代运营收费/官网建设
  • wordpress 网页排版错误/抖音seo关键词优化怎么做
  • 网站技术培训/青岛网站建设公司
  • 网站建设遵循的原则/百度竞价最低点击一次多少钱
  • 网站session/网络公司seo教程
  • 优化一个网站需要多少钱/徐州seo外包
  • 著名网站织梦/搜索广告排名
  • 做网站跟网站设计的区别/爱站seo综合查询
  • 做企业网站要怎么设计方案/百度上怎么发布作品
  • 深圳做网站公司排名/seo搜索优化招聘
  • 网站开发设计技术/最近几天的重大新闻事件
  • 北京网站建设维护/高级搜索引擎
  • 佛山免费发布信息的网站/网络营销的种类有哪些
  • Kafka运维实战 15 - kafka 重设消费者组位移入门和实战【实战】
  • Go、Node.js、Python、PHP、Java五种语言的直播推流RTMP协议技术实施方案和思路-优雅草卓伊凡
  • 【0基础PS】PS(Photoshop)与Ai( Illustrator )等相似软件区别
  • 【已解决】YOLO11模型转wts时报错:PytorchStreamReader failed reading zip archive
  • Java项目中定时任务三方工具和技术的深度应用指南
  • Vue 3 面试题全套题库