列表

详情


NC243336. 游戏购买!

描述

小竹成功从家里逃了出来,他决定去小胖家避一避。但是小胖要求小竹带一个刺激度大于 x 的游戏才能去他家。

为了防止被妈妈或她的朋友发现,小竹不会在道路上行走,而是在建筑物与建筑物之间穿行。

街道表现为一个 的网格,网格上只有两种建筑: 商店和住宅。商店可以通过而住宅无法通过。

小竹每次从当前所在网格可以行走到上下左右的网格中,但不能移动到网格的边界之外和别人的家中。正式的说,如果他在坐标为 (i,j) 的网格里,他可以选择 四个方向行走。

在位置 (i,j) 上的商店有一个刺激度为 的游戏,小竹可以购买他所经过的商店中的游戏并带走。若 -1 则代表这个位置是个住宅,无法通过。

注意:小胖家以及小竹家均可以被通过。

假设相邻的建筑物的距离均为 1,小竹想知道带一个刺激度高于 x 的游戏去小胖家需要的最短距离是多少?如果这是不可能实现的,请输出 -1

输入描述

第一行三个整数 

第二行四个整数 表示起点与终点的坐标,均为0

接下来 n 行,每行 m 个整数,第 i 行第 j 个整数 ,其中所有商店的

输出描述

一行一个整数,表示最短距离,若无法携带一个刺激度大于 x 的游戏到小胖家,输出-1。

示例1

输入:

3 3 1
1 1 3 3
0 1 2
1 1 -1
1 1 0

输出:

6

说明:

小竹从家 (1,1) 出发,需要先前往唯一可以购买刺激度大于 1 游戏的商店 (1,3) 买到刺激度为 2 的游戏再去小胖家。路线为  (1,1)->(1,2)->(1,3)->(1,2)->(2,2)->(3,2)->(3,3)总距离为6。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3 解法, 执行用时: 6491ms, 内存消耗: 230656K, 提交时间: 2022-11-12 21:19:42

from typing import *
from collections import *
move=[[0,1],[0,-1],[1,0],[-1,0]]
def get(a:int,b:int,grid:List[List[int]])->List[List[int]]:
    q=deque([[a-1,b-1,0]])
    ans=[[-1]*2000 for i in range(2000)]
    ans[a-1][b-1]=0
    while q:
        arr=q.popleft()
        for m in move:
            x,y=arr[0]+m[0],arr[1]+m[1]
            if x<0 or x>=len(grid) or y<0 or y>=len(grid[0]) or ans[x][y]>=0 or grid[x][y]==-1:
                continue
            ans[x][y]=arr[2]+1
            q.append([x,y,arr[2]+1])
    return ans
n,m,x=map(int,input().split())
sx,sy,ex,ey=map(int,input().split())
grid=[]
for i in range(n):
    grid.append(list(map(int,input().split())))
ans=1000000
d1,d2=get(sx,sy,grid),get(ex,ey,grid)
for i in range(n):
    for j in range(m):
        if d1[i][j]>=0 and d2[i][j]>=0 and grid[i][j]>x:
            ans=min(ans,d1[i][j]+d2[i][j])
print(-1 if ans==1000000 else ans)

C++(g++ 7.5.0) 解法, 执行用时: 1124ms, 内存消耗: 49432K, 提交时间: 2022-11-11 19:25:08

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define M 1000000007

int i,j,k,n,m,t,a[2050][2050],f[2050][2050][2],dz;
vector<pair<int,int> >v={{0,1},{0,-1},{1,0},{-1,0}};

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>m>>t;
	int x1,y1,x2,y2;
	cin>>x1>>y1>>x2>>y2;
	for(i=1;i<=n;i++)for(j=1;j<=m;j++)cin>>a[i][j];
	memset(f,-1,sizeof(f));
	queue<tuple<int,int,int> >q;
	q.push({x1,y1,0});
	f[x1][y1][0]=0;
	while(!q.empty()){
		auto [x,y,z]=q.front();q.pop();
		//printf("NMSL%d %d %d\n",x,y,z);
		for(auto [dx,dy]:v){
			dx+=x;dy+=y;dz=z;
			if(dx<1||dx>n||dy<1||dy>m)continue;
			if(a[dx][dy]==-1)continue;
			if(a[dx][dy]>t)dz=1;
			if(f[dx][dy][dz]!=-1)continue;
			f[dx][dy][dz]=f[x][y][z]+1;
			q.push({dx,dy,dz});
		}
	}
	cout<<f[x2][y2][1];
}

C++(clang++ 11.0.1) 解法, 执行用时: 2335ms, 内存消耗: 49404K, 提交时间: 2022-11-28 10:25:07

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int i,j,k,n,m,t,a[2050][2050],f[2050][2050][2],dz;
vector<pair<int,int> >v={{0,1},{0,-1},{1,0},{-1,0}};
int main() {
	cin>>n>>m>>t;
	int x1,y1,x2,y2;
	cin>>x1>>y1>>x2>>y2;
	for(i=1;i<=n;i++)for(j=1;j<=m;j++)cin>>a[i][j];
	memset(f,-1,sizeof(f));
	f[x1][y1][0]=0;
	queue<tuple<int,int,int> >q;
	q.push({x1,y1,0});
	while(!q.empty()){
		auto [x,y,z]=q.front();q.pop();
		for(auto [dx,dy]:v){
			dx+=x;dy+=y;dz=z;
			if(dx<1||dx>n||dy<1||dy>m||a[dx][dy]==-1)continue;
			if(a[dx][dy]>t)dz=1;
			if(f[dx][dy][dz]!=-1)continue;
			f[dx][dy][dz]=f[x][y][z]+1;
			q.push({dx,dy,dz});
		}
	}
	cout<<f[x2][y2][1];
}

上一题