ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

旅游

2022-04-09 22:00:38  阅读:146  来源: 互联网

标签:25 sx mp int que 旅游 dis


 

题目描述

在一个大小为n∗mn∗m的方格地图mp[][]mp[][]上,初始时你在方格(1,1)(1,1)位置。有kk个旅游景点你想去玩。
地图中标记为..的方格可以行走,标记为##的方格有障碍物不能经过,标记为数字的方格表示景点的编号。
每秒钟你可以朝上,下,左或右移动一格位置,问最少花多少时间走遍kk个景点。
如果无法走遍kk个景点则输出−1−1。保证起点的方格没有障碍物。

输入

第一行三个正整数表示n,m,kn,m,k。
接下来nn行,每行一个长度为mm的字符串表示地图mp[][]mp[][]。
1≤n,m≤20,1≤k≤91≤n,m≤20,1≤k≤9。

输出

输出一个整数表示答案。

样例输入 复制

5 7 3
.......
....1..
..2#.3.
.......
.......

样例输出 复制

9

提示

样例:先去2,再去1,再去3。

5 8 3
....#..1
........
##...###
........
.2..#..3
25

先去2,再去3,再去1。
3 6 1
..#..1
..#...
..####

-1

 

代码:

#include <bits/stdc++.h>
using namespace std;
int n, m, k;
int mp[25][25];

struct qnode {
int x, y;
};

int tx[] = {0, -1, 0, 1};

int ty[] = {1, 0, -1, 0};
queue<qnode> que;
int dis[25][25], cost[25][25], vis[25][25];

void bfs(int sx, int sy)
{
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
dis[i][j] = 1e9;
}
}
memset(vis, 0, sizeof(vis));
que.push({sx, sy});
vis[sx][sy] = 1;
dis[sx][sy] = 0;
while (que.size()) {
qnode tmp = que.front();
que.pop();
int x = tmp.x;
int y = tmp.y;
if (mp[x][y] >= 0 && mp[x][y] <= 9) {
cost[mp[sx][sy]][mp[x][y]] = cost[mp[x][y]][mp[sx][sy]] = dis[x][y];
}
for (int i = 0; i < 4; i++) {
int nx = x + tx[i];
int ny = y + ty[i];
if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && mp[nx][ny] != -2 && vis[nx][ny] == 0) {
dis[nx][ny] = dis[x][y] + 1;
vis[nx][ny] = 1;
que.push({nx, ny});
}
}
}
}
int used[20], ans = 1e9;

void dfs(int u, int val, int cnt)
{
used[u] = 1;
if (cnt == k) {
ans = min(ans, val);
}
for (int i = 1; i <= k; i++) {
if (used[i] == 0) {
dfs(i, val + cost[u][i], cnt + 1);
}
}
used[u] = 0;
}

int main()
{
cin >> n >> m >> k;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
char ch;
cin >> ch;
if (i == 1 && j == 1)
mp[i][j] = 0;
else {
if (ch == '.') {
mp[i][j] = -1;
} else if (ch == '#') {
mp[i][j] = -2;
} else {
mp[i][j] = ch - '0';
}
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (mp[i][j] >= 0 && mp[i][j] <= 9) {
bfs(i, j);
}
}
}
dfs(0, 0, 0);
if(ans==0) cout<<-1;
else cout << ans;
return 0;
}

标签:25,sx,mp,int,que,旅游,dis
来源: https://www.cnblogs.com/signup/p/16123872.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有