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

中国建设积分商城网站湘潭做网站公司选择封象网做网站公司

中国建设积分商城网站,湘潭做网站公司选择封象网做网站公司,晋江网站设计泉州名扬专业,宿迁市建设局网站怎么投诉Snake Move - Problem - QOJ.ac 考虑最短路 因为我们只移动蛇头,后续蛇身的移动到其他位置时并不影响那个位置的答案,所以只需要考虑蛇身所在初始位置所带来的影响: 对于移动操作可以看成:每走一步,蛇身长度-1(蛇尾往…

Snake Move - Problem - QOJ.ac

考虑最短路

因为我们只移动蛇头,后续蛇身的移动到其他位置时并不影响那个位置的答案,所以只需要考虑蛇身所在初始位置所带来的影响:

对于移动操作可以看成:每走一步,蛇身长度-1(蛇尾往前进一位);

按步数大小排序,每次取出步数最小的点,然后更新当前的蛇身长度,用这个点去更新其他点

1.如果没有撞到蛇身和障碍,直接更新当前距离+1

2.假如在走的过程中撞到蛇身时,可以选择做操作S直到这个蛇身变成蛇尾再走(蛇头可以走向蛇尾),需要的步数是:这个蛇身到当前蛇尾的距离+1

#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define endl '\n'
#define pii pair<int, int>
const int N = 1E6 + 10;
const int mod = 998244353;
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};struct node
{int d, x, y;bool operator<(const node p) const{return d > p.d;}
};
void solve()
{int n, m, k;cin >> n >> m >> k;vector<node> v(k + 1);                                              // 记录蛇身位置vector<vector<long long>> f(n + 1, vector<long long>(m + 1, 1e18)); // 记录最短路vector<vector<char>> mp(n + 1, vector<char>(m + 1, '1'));           // 存图vector<vector<int>> is(n + 1, vector<int>(m + 1, 0));               // 记录蛇身下标vector<vector<int>> vis(n + 1, vector<int>(m + 1, false));          // 记录点是否被走过for (int i = 1; i <= k; i++){cin >> v[i].x >> v[i].y;is[v[i].x][v[i].y] = i;}for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){cin >> mp[i][j];}}priority_queue<node> q;q.push({0, v[1].x, v[1].y});f[v[1].x][v[1].y] = 0;int p = k;while (!q.empty()){auto [d, x, y] = q.top();q.pop();if (vis[x][y])continue;vis[x][y] = 1;while (p > 1 && p != k - d) // 走了多少步,就缩短多少个蛇身长度{is[v[p].x][v[p].y] = 0;p--;}for (int i = 0; i < 4; i++){int nx = x + dx[i];int ny = y + dy[i];if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && mp[nx][ny] == '.'){if (is[nx][ny] == 0 || (nx == v[p].x && ny == v[p].y)) // 这个位置不是蛇身或者是蛇尾,就可以正常走{if (f[nx][ny] > d + 1){f[nx][ny] = d + 1;q.push({d + 1, nx, ny});}}else // 是蛇身{if (f[nx][ny] > d + 1 + p - is[nx][ny]){f[nx][ny] = d + 1 + p - is[nx][ny];q.push({d + 1 + p - is[nx][ny], nx, ny});}}}}}unsigned long long res = 0;for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){// cout << f[i][j] << ' ';if (f[i][j] != 1e18)res += (unsigned long long)f[i][j] * (unsigned long long)f[i][j];// res %= (1ll << 64);}// cout << endl;}cout << res << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t = 1;// cin >> t;while (t--)solve();
}

理论时间复杂度nmlog(nm),按理来说最高会跑2e8次,但是由于这是矩阵图,每个点最多连四条边,并且每个点只更新一次所以实际复杂度不高,可以在1s左右通过本题

http://www.dtcms.com/wzjs/835612.html

相关文章:

  • 思乐科技 成都网站建设建设实木餐桌椅移动网站
  • 网站建设开发公司报价扬州外贸网站seo
  • 营销型企业网站建设网站建设合作协议
  • 建设部网站怎么查询相关专业淘宝服务商平台
  • 做网站基础网站流量如何提高
  • 网站建设与管理基础淘宝官网电脑版登录界面
  • 肇庆网站推广排名龙华营销型网站设计
  • 江苏质监站网站做资料杭州做小程序开发的公司有哪些
  • 网站开发语言数据库有几种王烨怎么读
  • 厦门网站建设企业网站服务器 数据库服务器
  • 济南腾飞网络网站建设教育培训机构排名
  • 江西机场建设集团网站推荐网站建设话术
  • 合肥的网站建设公司哪家好网站建设怎么制作网站
  • 网站设计基本步骤网站运营与营销
  • 如何做个购物网站莱芜二手房
  • 怎么把文件发送到网站成都网站建设科技公司
  • 四个字网站 域名WordPress更换域名之后
  • 福州网站建设出格南通网站建设知识
  • 网站的站长是什么意思网络规划设计师待遇怎么样
  • 台州做网站电话dreamviewer网页设计
  • 设计公司取名大全最新版的株洲网站优化找哪家
  • 广州番禺建网站微信推广平台哪家好
  • 佛山哪里有做网站的支付网站建设
  • 如何进行网站域名解析英文网站的首页怎么做
  • 网站建设丷金手指专业十五周口高端网站建设
  • 典型的电子商务网站西安电子商务网站开发
  • 上海wordpress网站建设驻马店 市网站建设
  • 服务器如何架设网站学校网站建设与维护
  • 小企业网站推广一级造价工程师报考条件及时间
  • 二级建造师最好的网站手机付费咨询网站建设