列表

详情


NC219033. 有始有终

描述

给出一个列的矩阵,矩阵中每个元素都是的整数代表对应格的高度,若两格的高度之差不超过,则从一格可以移动到另一格。同时,可以使用一种技能,技能的效果是将该格变为电梯,这样该格和其相邻的格所有格都可以忽略高度差限制。现在给出起点和终点,计算从起点走到终点最少使用的技能数。

输入描述

第一行一个数字 ,代表接下来测试数据的组数

对于每个测试数据,第一行有两个数字 ,表示著矩阵的大小,每行有  个数字,共  行

第二行有两个数字 ,代表起点座标。

第三行有两个数字 ,代表终点座标。

第四行有一个数字 ,代表能往相邻且高度差不大于  的矩阵格行走

最后的  行,每行有  个用空白隔开的整数,为每个矩阵格的高度,且介于  到  之间(包含  和 )。

请注意,地图的左上角座标为,而右下角为

输出描述

对于每组测试数据,输出一个非负整数代表使用技能的次数

示例1

输入:

2
9 9
1 1
5 5
3
9 9 9 9 9 9 9 9 9
1 1 1 1 1 1 1 1 9
9 9 9 9 9 9 9 1 9
9 1 1 1 1 1 9 1 9
9 1 9 9 9 1 9 1 9
9 1 9 1 1 1 9 1 9
9 1 9 9 9 9 9 1 9
9 1 1 1 1 1 1 1 9
9 9 9 9 9 9 9 9 9
21 14
17 12
14 11
0
7 85 12 80 90 45 78 13 57 39 61 81 32 62 49 32 45 72 65 41 39
33 37 53 31 4 24 95 53 66 32 70 30 76 49 65 68 83 15 83 47 19
83 0 67 74 15 62 42 79 85 15 51 65 53 14 90 62 37 7 42 22 7
45 1 62 5 38 84 73 0 73 50 84 41 12 13 33 79 87 86 38 59 61
72 38 24 11 72 1 56 1 11 8 50 34 57 52 80 71 17 23 72 88 77
82 9 93 70 73 57 18 27 52 60 26 47 23 56 21 16 85 87 85 63 64
12 45 77 84 25 43 35 69 17 40 69 86 57 29 55 43 53 88 0 33 64
15 78 28 91 52 91 66 42 10 47 39 60 23 5 7 42 59 82 91 33 0
68 6 35 81 7 80 42 16 78 53 79 3 15 94 74 15 48 16 91 8 65
35 41 8 74 54 41 94 71 65 65 8 81 12 13 68 94 30 1 3 12 88
80 31 58 3 45 15 23 71 80 89 95 93 28 39 3 72 63 61 41 63 57
73 52 14 32 92 5 30 2 56 34 18 77 75 22 84 76 91 24 47 83 66
17 30 61 93 88 4 51 95 1 94 48 75 86 86 67 1 3 89 85 88 56
11 12 14 11 57 14 92 60 16 74 14 61 45 52 81 82 52 79 45 53 4

输出:

0
2

原站题解

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

C++(clang++11) 解法, 执行用时: 31ms, 内存消耗: 760K, 提交时间: 2021-03-26 13:04:10

#include<bits/stdc++.h>
using namespace std;

struct node
{
	int x,y,h;
	bool operator<(const node &a)const
	{
		return a.h<h;
	}
}f;
priority_queue<node>Q;
int dx[]={1,-1,0,0,-1,-1,1,1,2,-2,0,0},dy[]={0,0,1,-1,1,-1,1,-1,0,0,2,-2};
bool V[35][35][75];
int main()
{
	int i,j,n,m,sx,sy,ex,ey,nx,ny,nh,a[35][35],D,T;
	scanf("%d",&T);
	while(T--){
		scanf("%d%d%d%d%d%d%d",&m,&n,&sy,&sx,&ey,&ex,&D);
		sy--,sx--,ey--,ex--;
		memset(V,0,sizeof(V));
		while(!Q.empty())Q.pop();
		for(i=0;i<n;i++)
			for(j=0;j<m;j++)scanf("%d",&a[i][j]);
		V[sx][sy][0]=1,Q.push({sx,sy,0});
		while(!Q.empty()){
			f=Q.top(),Q.pop();
			if(f.x==ex&&f.y==ey)break;
			for(i=0;i<12;i++){
				nx=f.x+dx[i],ny=f.y+dy[i],nh=f.h;
				if(nx<0||nx>=n||ny<0||ny>=m)continue;
				if(i<4&&abs(a[f.x][f.y]-a[nx][ny])>D)nh++;
				if(i>=4)nh++;
				if(!V[nx][ny][nh])V[nx][ny][nh]=1,Q.push({nx,ny,nh});
			}
		}
		printf("%d\n",f.h);
	}
	return 0;
}

上一题