首页 > 其他分享 >2023南海区信息学区赛(初中组) T3 步数(原始)

2023南海区信息学区赛(初中组) T3 步数(原始)

时间:2023-12-23 19:45:26浏览次数:25  
标签:.. int T3 南海区 nx ny lld% 2023 dis

第3题     步数(原始) 查看测评数据信息

有一个二维网格,从上往下,行的编号从1至n,从左往右,列的编号是1至m。

第i行第j列的格子编号为(i,j),如果 a[i][j]为 '@',表示格子(i,j)有障碍物,

如果a[i][j]为'.'则表示格子(i,j)可通行。

奶牛bessie当前在 格子(r1,c1),它每一步可以选择往上、下、左、右四个方向之一走 1 至k 格,也就是每一步至少走1格,最多可以走k格。

任何时刻都不能进入障碍物格子,也不能走到网格外面,不能走出界。

问你最少需要多少步才能走到 格子(r2,c2) ,如果不能走到,输出 −1 。

 

输入格式

 

第一行,n,m,k。 1<=n,m,k<=1000000,  n*m <= 1000000。

第二行,r1, c1, r2, c2。 1<=r1,r2<=n,  1<=c1,c2<=m。

接下来是n行m列的二维网格a[1..n][1..m],其中a[i][j]是'@'或'.'。

【提示】

本题测试点数据较大,只有约10%的数据满足n*m<=100

 

 

输出格式

 

一个整数。

 

输入/输出例子1

输入:

3 5 2

3 2 3 4

.....

.@..@

..@..

 

输出:

5

 

输入/输出例子2

输入:

1 6 4

1 1 1 6

......

 

输出:

2

 

样例解释

 

 

分析

和普通广搜没什么区别,就是最短路了,唯一也就是每一步至少走1格,最多可以走k格。

这题毕竟恶心的是数组范围,卡了很久,最终还是开主函数里面了,根据nm的值来定,不开固定的了

同时注意一下剪枝,别超时了,附讲解时的图

同时,不能用vis来剪走过的路,因为可能确定了值但不是最小值!

还有注意起点就是‘@’的情况

 

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

const int N=6005;
const int dx[]={-1, 0, 0, 1}, dy[]={0, -1, 1, 0};
struct point
{
	int x, y;
};
long long n, m, k, r1, c1, r2, c2;
queue<point> q;

int main()
{
	scanf("%lld%lld%lld", &n, &m, &k);
	scanf("%lld%lld%lld%lld", &r1, &c1, &r2, &c2);
	
    char mp[n+5][m+5]; //注意!!
    long long dis[n+5][m+5];
    for (int i=1; i<=n; i++)
		scanf("%s", mp[i]+1);
	if (mp[r1][c1]=='@') //注意!
	{
		printf("-1");
		return 0;
	}
    
	int x=r1, y=c1;
	q.push({x, y});
	memset(dis, 63, sizeof dis);
	dis[x][y]=0;
	while (!q.empty())
	{
		point t=q.front();
		q.pop();
		//vis[t.x][t.y]=0;
		for (int j=0; j<4; j++)
		{
			for (int i=1; i<=k; i++)
			{
				int nx=t.x+dx[j]*i, ny=t.y+dy[j]*i; //*i相当于调整走1~k步
				if (nx<1 || nx>n || ny<1 || ny>m) break;
				if (mp[nx][ny]=='@') break;
				if (dis[t.x][t.y]+1>dis[nx][ny]) break;
				//if (vis[nx][ny]) break;
				
				if (dis[nx][ny]>dis[t.x][t.y]+1)
				{
					dis[nx][ny]=dis[t.x][t.y]+1;
					q.push({nx, ny});
				}
                
				//vis[nx][ny]=1;
			}
		}
	}
	/*for (int i=1; i<=n; i++)
	{
		for (int j=1; j<=m; j++)
			cout<<dis[i][j]<<" ";
		cout<<endl;
	}*/
		
	if (dis[r2][c2]==dis[0][0]) printf("-1");
	else printf("%lld", dis[r2][c2]);
	return 0;
}
/*
5 6 4
1 1 2 4
......
.@@.@@
.....@
..@@.@
@....@
*/

  

标签:..,int,T3,南海区,nx,ny,lld%,2023,dis
From: https://www.cnblogs.com/didiao233/p/17923520.html

相关文章

  • 2023
    2023/11/4简单看完翁恺C语言入门后的一些难点经典的素数打印,以及观察改良后的代码,还有构造素数表二进制的补码很关键,理解了它就能理解字节的知识8个字节的二进制数的范围,加了unsigned就非负且乘二了,还加了有形象的图说明超过那个范围就会回环往复,inf表示无穷,nan表示不存在浮......
  • 2023南海区信息学区赛(初中组) T1二进制整除
    第1题   二进制整除 查看测评数据信息交换二进制数相邻两个位置的数字,需要花费1元的代价。读入整数n以及n位二进制数(也许有前导0),你需要依次回答n个独立的问题,第i个问题(1<=i<=n)是这样的:假如要使得读入的二进制数是2^i的倍数,至少需要花费多少元的代价?如果不可能,则输出......
  • 2023-2024-1 20231416《计算机基础与程序设计》第十三周学习总结
    作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK13这个作业的目标自学《C语言程序设计》第十二章并完成云班课测试作业正文 https://www.cnblogs.co......
  • 按马哥教育关于2023版Linux云计算SRE工程师掌握知识类别,你会了哪些?
    模块1:Linux新手快速基础入门模块2:面试必备-企业级Shell脚本编程实战模块3:Linux系统结构、内核、进程进阶模块4:网络管理管理及互联网通信实战模块5:互联网常见服务应用实战模块6:网络安全、加密及安全通信实战模块7:安全加固内核防火墙Iptables模块8:企业级Web-LA/NMP架......
  • Test20231016
    考得真烂。被初一dalao薄纱。[题面+std](https://www.wenshushu.cn/drive/cfraky1du37)。T1:数学结论题:裴蜀定理,即:$a\timesx+b\timesy=\gcd(a,b)$T2:小清新贪心题,清楚一点性质**从点$i\toj(j>i)$然后又从点$j\tok(j>k)$那么为什么不能从$i$直接到$k$呢?**根据......
  • Nuxt3 基础总结
    前言Nuxt3的对比之前的2和1,只能感叹前端发展的越来越快了,不学无术开发更快打包更小支持vite支持vue3支持自动引入支持文件路由支持布局系统支持多种渲染模式支持typescript支持composition-api 安装NUXT3需要node大于16的版本brew更新node  bre......
  • 2023-12-23训练总结
    T1计数ProblemDescriptionInputOutputSampleInputCopy210SampleOutputCopy90DataConstraint忘记初始化了调了半个小时。维护\(f_{i,0/1}\)表示长度为\(i\),最高位为\(0\)/不为\(0\)的合法方案数。明显有:\[f_{i,0}\getsf_{i-1,1}\\f_{i,1}\g......
  • 2023-12-23:用go语言,一支n个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河 敌军在T
    2023-12-23:用go语言,一支n个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河敌军在T的时长后到达河面,没到过对岸的士兵都会被消灭现在军队只找到了1只小船,这船最多能同时坐上2个士兵。当1个士兵划船过河,用时为a[i]当2个士兵坐船同时划船过河时,用时为max(a[j],a[i])两士兵中用时最......
  • 2023-12-23:用go语言,一支n个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河 敌军在T
    2023-12-23:用go语言,一支n个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河敌军在T的时长后到达河面,没到过对岸的士兵都会被消灭现在军队只找到了1只小船,这船最多能同时坐上2个士兵。当1个士兵划船过河,用时为a[i]当2个士兵坐船同时划船过河时,用时为max(a[j],a[i])两士......
  • [CSP-S 2023] 密码锁
    题目描述小Y有一把五个拨圈的密码锁。如图所示,每个拨圈上是从\(0\)到\(9\)的数字。每个拨圈都是从\(0\)到\(9\)的循环,即\(9\)拨动一个位置后可以变成\(0\)或\(8\),因为校园里比较安全,小Y采用的锁车方式是:从正确密码开始,随机转动密码锁仅一次;每次都是以某个幅度......