同化的题解

时间限制: 1000ms

空间限制: 524288kB

题目描述

古人云:“近朱者赤近墨者黑”。这句话是很有道理的。这不鱼大大和一群苦命打工仔被安排进厂拧螺丝了。
进厂第一天,每个人拧螺丝的动力k都是不同且十分高涨的。但是当大家坐在一起后会聊天偷懒,导致第二天时,每个人的拧螺丝动力变为昨天自己和四周人拧螺丝动力的最大公约数。当拧螺丝动力掉到1时,鱼大大就会跑路。
厂子的老板会对鱼大大这群打工仔安排拧螺丝的位置,可以简单看成是一个N*M的矩阵。现有工厂座位安排表,鱼大大坐在第X行第Y列,问最少几天后鱼大大就会跑路

输入格式

第一行两个整数N,M,表示矩阵的行数和列数。
接下来 N 行,每行 M 个整数,第 i 行第 j 列的整数 a_{i,j}表示为该位置的人第一天拧螺丝的动力。
接下来一行两个整数 X,Y,表示鱼大大的位置。

输出格式

一行一个整数表示鱼大大第几天会跑路
(若是动力永远不掉到1,则为不会跑路,输出-1)

样例

Input 1
2 2
2 2
1 2
2 1
Output 1
0
Input 2
2 2
2 2 
2 2
1 1
Output 2
-1
Input 3
3 3
3 2 3
2 3 2
3 2 3
2 2
Output 3
1

数据范围

2 ≤ N,M ≤ 1000;
1 ≤ a_{i,j} ≤ 100000;
保证X,Y合法,即鱼大大位置肯定在矩阵范围中

题目大意:

有一个N*M的矩阵,对其进行变换,将矩阵中的每一个元素变为其上下左右及自身(不存在则忽略)的最大公约数。问a_{X,Y}多少次变换后会变成1.

主要思路:

这个题目是一道bfs+gcd的题目。我们可以维护一个集合S,最初是只有a_{X,Y}这个元素,那么每一次变换的时候,S里的元素都会变成gcd(S_1,S_2,S_3...S_n注:其中n表示S的长度),注:因为是gcd,而上面的式子也可以转化成\gcd(S_1,\gcd(S_2,\gcd(S_3,...)))以此类推直到\gcd(S_{n-1},S_n)。每次变换S也会扩大,具体请看图,图是把S当成一个矩阵来看。

图示1

通过图可以发现,每次S扩大时,是把S中所有的边缘元素的相邻的上下左右的元素且没有在集合中出现过的元素给加入进来,而这就是一个bfs了。

最后在bfs中,如果当前这个元素<=1了,那么就跳出(因为这个元素会被枚举到,一定是在集合S中,而S中有一个<=1,那其他元素肯定也会<=1)

注:

题目中说了,如果永远不是1,输出-1

代码code:

#include<bits/stdc++.h>
using namespace std;
int a[1010][1010];
int n,m;
int vis[1010][1010];
int ret=-1;//没有输出-1 
int x,y;
int dx[] = {0,-1,0,1};
int dy[] = {1,0,-1,0};
struct node{int x,y,step;
};
void bfs()
{queue<node> q;q.push({x,y,0});while(!q.empty()){auto tmp = q.front();q.pop();int x1=tmp.x,y1=tmp.y,step = tmp.step;if(a[x1][y1] == 1)//如果这个元素为一 {ret=step;return ;}for(int i=0;i<4;i++)//上下左右四个方向 {int tx=x1+dx[i],ty=y1+dy[i];if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&!vis[tx][ty]){vis[tx][ty] = 1;//标记 a[tx][ty] = __gcd(a[x1][y1],a[tx][ty]);//取个gcd q.push({tx,ty,step+1});//加入集合 }}}
}
int main()
{cin>>n>>m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>a[i][j];}} cin>>x>>y;bfs();cout<<ret;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/305264.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

axios配置请求头content-type 和 get/post请求方式

axios配置请求头content-type https://blog.csdn.net/wojiushiwo945you/article/details/107653962 axios 是Ajax的一个插件&#xff0c;axios虽然是一个插件&#xff0c;但是我们不需要通过Vue.use(axios)来使用&#xff0c;下载完成后&#xff0c;只需在项目中引入即可。(一…

如何利用腾讯文档提升办公效率?

1. 实时协作功能&#xff1a;利用腾讯文档的实时协作功能&#xff0c;多人可以同时编辑和评论文档&#xff0c;大大提高团队工作效率。2. 云存储和同步&#xff1a;通过云存储和同步功能&#xff0c;方便地存储、访问和分享文档&#xff0c;不再受到时间和地点的限制。3. 版本控…

Google Ad帐号被封?这几个关键点看好

海外广告投放工作中&#xff0c;账号是非常重要的环节。与在Facebook上运行广告相比&#xff0c;运行Google Ads在代理选择方面通常没有那么严格&#xff0c;因为 Google 对 IP 使用并不那么严格。但是&#xff0c;这并不意味着您可以不加考虑地使用任何代理IP。在本文中&#…

Kubernetes (三) 集群升级

一. 集群升级 v1.23.15----v1.24.0 官网地址&#xff1a; https://v1-24.docs.kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/ kubectl里边内…

2023.12.28力扣每日一题——收集巧克力

2023.12.28 题目来源我的题解&#xff08;参考力扣官方题解&#xff09;方法一 枚举方法二 二次差分 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2735 我的题解&#xff08;参考力扣官方题解&#xff09; 嗯……今天不会&#xff0c;就当一次搬运工吧。 方法一 枚举…

WEB 3D技术 three.js 设置环境贴图 高光贴图 场景设置 光照贴图

上文WEB 3D技术 three.js 基础网格材质演示几何体贴图 ao贴图效果我们简单构建了一个贴图和ao贴图的几何体材质 我们接下来 来看一下透明度贴图 我们还是官网搜索 MeshBasicMaterial 然后 是我们的 alphaMap 属性 这里 黑色为完全透明 白色 完全不透明 黑白之间还有灰色 这个灰…

基于SSM实现的电动汽车充电网点管理系统

一、系统架构 前端&#xff1a;jsp | jquery | bootstrap | css 后端&#xff1a;spring | springmvc | jdbc 环境&#xff1a;jdk1.8 | mysql 二、代码及数据库 三、功能介绍 01. web端-首页 02. web端-登录 03. web端-注册 04. web端-我要充电 05. web端-个人中心-消…

thinkphp6.0升级到8.0

目录 一&#xff1a;升级过程 二&#xff1a;报错处理 最近写的项目需要使用thinkphp8.0&#xff0c;之前的老项目需要从php6.0升级到8.0&#xff0c;特此记录下升级过程。 一&#xff1a;升级过程 查看版本&#xff1a; php think version,我目前的版本是6.1.4 生成thin…

SuperMap Hi-Fi 3D SDK for Unity矢量面贴地贴模型

作者&#xff1a;kele 一、背景 SuperMap Hi-Fi 3D SDK&#xff08;2023 11i&#xff09; for Unity推出新功能&#xff1a;支持矢量面同时贴地形图层和模型图层&#xff0c;并且能实现数据点击查询属性、更改初始填充颜色、初始边框线颜色、选中填充颜色、选中边框线颜色、控…

【强化学习】基于蒙特卡洛MC与时序差分TD的简易21点游戏应用

1. 本文将强化学习方法&#xff08;MC、Sarsa、Q learning&#xff09;应用于“S21点的简单纸牌游戏”。 类似于Sutton和Barto的21点游戏示例&#xff0c;但请注意&#xff0c;纸牌游戏的规则是不同且非标准的。 2. 为方便描述&#xff0c;过程使用代码截图&#xff0c;文末附链…

ctf_show(web入门笔记)持续更新中

信息收集 1-2&#xff1a;查看源代码 3&#xff1a;bp抓包 4&#xff1a;robots.txt&#xff08;这个文件里会写有网站管理者不想让爬虫的页面或其他&#xff09; 5&#xff1a;网站源代码泄露index.phps 6&#xff1a;同样也是源码泄露&#xff0c;&#xff08;拿到以后还…

Visual Studio 2013 中创建一个基于 Qt 的动态链接库:并在MFC DLL程序中使用

在本地已经安装好 Qt 的情况下&#xff0c;按照以下步骤在 Visual Studio 2013 中创建一个基于 Qt 的动态链接库&#xff1a; 一、新建 Qt 项目&#xff1a; 在 Visual Studio 中&#xff0c;选择 “文件” -> “新建” -> “项目…”。在 “新建项目” 对话框中&#…