搜索?——P3956 [NOIP2017 普及组] 棋盘

news2024/10/6 6:46:09

传送门: [NOIP2017 普及组] 棋盘 - 洛谷

思路: 将棋盘的每一个格子看做一个点,建一个无向图用来跑最短路.

这道题本应用搜索来做,但是转换成最短路好像简单点

建图:

1.对于已经有颜色的格子,在扫描四个方向的格子对相同颜色的建条长度为0的边,不同颜色的建条长度为1的边

2.对于没有颜色的格子,对于四个方向所有有颜色的格子都要先建条长度为2的边,再在四周有颜色格子之间两两建边,颜色相同就建长度为2的边,颜色不同就建长度为3的边,如下图所示一个没有颜色的格子四周格子的边

建好边就可以跑spfa了,但是这个做法只有90分

90分(满分100)的代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int> PII;
const double PI=3.1415926535;
const int N=1e6+10;
bool st[N];
int d[110][110];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1
};
int e[N],ne[N],w[N],h[N],idx;
int dist[N];
int n,m;
void add(int a,int b,int c)
{
    e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
void spfa()
{
    memset(dist,0x3f,sizeof dist);
    dist[m+1]=0;
    queue<int>que;
    que.push(m+1);
    while(que.size())
    {
        int t=que.front();
        que.pop();
        st[t]=false;
        for(int i=h[t];~i;i=ne[i])
        {
            int j=e[i];
            if(dist[j]>dist[t]+w[i])
            {
                dist[j]=dist[t]+w[i];
                if(!st[j])
                {
                    st[j]=true;
                    que.push(j);
                }
            }
        }
    }
}
signed main()
{
    memset(h,-1,sizeof h);
    scanf("%lld%lld",&m,&n);

    for(int i=1;i<=m;i++)
        for(int j=1;j<=m;j++)
        d[i][j]=-1;

    for(int i=1;i<=n;i++)
    {
        int x,y,c;
        scanf("%lld%lld%lld",&x,&y,&c);
        d[x][y]=c;
    }
    for(int i=1;i<=m;i++)
        for(int j=1;j<=m;j++)
    {
        if(d[i][j]!=-1)
        {
            for(int k=0;k<4;k++)
            {
                int x=i+dx[k];
                int y=j+dy[k];
                if(x<=0||x>m||y<=0||y>m)
                    continue;
                if(d[x][y]!=-1)
                {
                    if(d[x][y]==d[i][j])
                    {
                        add(x*m+y,i*m+j,0);
                    }else{
                        add(x*m+y,i*m+j,1);
                    }
                }
            }
        }else{
            vector<PII>v;
            for(int k=0;k<4;k++)
            {
                int x=i+dx[k];
                int y=j+dy[k];
                if(x<=0||x>m||y<=0||y>m)
                    continue;
                if(d[x][y]!=-1)
                v.push_back({x*m+y,d[x][y]});
                add(x*m+y,i*m+j,2);
                 add(i*m+j,x*m+y,2);
            }
            if(v.size()>1)
            {
                for(int i=0;i<v.size();i++)
                    for(int j=0;j<v.size();j++)
                {
                    if(i==j)
                        continue;
                    if(v[i].second!=v[j].second)
                    {
                        add(v[i].first,v[j].first,3);
                        add(v[j].first,v[i].first,3);
                    }else{
                         add(v[j].first,v[i].first,2);
                          add(v[i].first,v[j].first,2);
                    }
                }
            }
        }
    }
    
    spfa();

    if(dist[m*m+m]>=1e9)
        puts("-1");
        else
    cout<<dist[m*m+m];

	return 0;
}

还有,同样是转换成无向图建边的大佬的满分代码

题解 P3956 【棋盘】 - 恨妹不成穹 的博客 - 洛谷博客

题目中n的范围是1~1000,实际最多也就1000个点,所以可以使用dijkstra,

至于更加详细的建边过程在大佬博客里面

代码:

#include<bits/stdc++.h>
using namespace std;
bool f[1002];
int n,m,x[1002],y[1002],z[1002][1002],col[1002],sta,en,flag,s[1002];
void dj(int k)	
{
	s[k]=0;
	int maxn,t;
	for(int i=1;i<=m;i++)
	{
    	maxn=99999999;
    	for(int j=1;j<=m;j++)                 
    	{
        	if(f[j]==0&&s[j]<maxn)
       		{
            	maxn=s[j];
				t=j;
        	}
    	}
    	f[t]=1;
    	for(int j=1;j<=m;j++)
		{
			s[j]=min(s[t]+z[t][j],s[j]);
		}
	}
}
int main()
{
  	//freopen("chess.in","r",stdin);
  	//freopen("chess.out","w",stdout);
  	memset(z,1,sizeof(z));
  	memset(s,1,sizeof(s));
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x[i],&y[i],&col[i]);
		if(x[i]==1&&y[i]==1)
		{
			sta=i;
		}
		if(x[i]==n&&y[i]==n)
		{
			flag=1;
			en=i;
		}
	}
	if(flag==0)
	{
		en=m+1;
		x[en]=y[en]=n;
	}
	for(int i=1;i<m;i++)
	{
		for(int j=i+1;j<=m;j++)
		{
			if(abs(x[i]-x[j])+abs(y[i]-y[j])==1)
			{
				z[i][j]=z[j][i]=abs(col[i]-col[j]);
			}
			if(abs(x[i]-x[j])+abs(y[i]-y[j])==2)
			z[i][j]=z[j][i]=2+abs(col[i]-col[j]);
		}
	}
	if(flag==0)
	{
		for(int i=1;i<=m;i++)
		{
			if(abs(x[i]-x[en])+abs(y[i]-y[en])==1)
			{
				z[i][en]=z[en][i]=2;
			}
		}
		m++;
	}
	dj(sta); 
	if(s[en]<16843009)
	cout<<s[en];
	else
	cout<<-1;
	
	
	
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【目标检测】目标检测究竟发展到了什么程度?聊聊这22年!

目录&#xff1a;目标检测的发展历程一、引言二、背景三、目标检测发展脉络3.1 传统目标检测算法3.1.1 Viola Jones Detector3.1.2 HOG Detector3.1.3 DPM Detector3.1.4 局限性3.2 Anchor-Based中的Two-stage目标检测算法3.2.1 RCNN3.2.2 SPPNet3.2.3 Fast RCNN3.2.4 Faster R…

Allegro如何设置Net Group操作指导

Allegro如何设置Net Group操作指导 Allegro除了可以对一组网络设置Bus以外,同样支持创建Net Group,如下图 功能和Bus的功能类似,并且同一个Net Group里面的网络可以形成一个shape形式的Group,方便查看 具体创建方法操作如下 打开规则管理器选择Electrical

MySQL窗口函教-开窗聚合函数(SUM()、AVG()、MAX()、MIN()、COUNT())

MySQL窗口函教-开窗聚合函数&#xff08;SUM()、AVG()、MAX()、MIN()、COUNT()&#xff09;和传统的聚合函数区别&#xff1f;最大的区别在于&#xff0c;一个操作列&#xff0c;一个是依次操作行&#xff0c;最终显示出每一行&#xff0c;最后的效果就是呈现叠加的效果-- 开窗…

Windows环境下安装配置Mosquitto服务及入门操作介绍

文章目录一、概念梳理二、下载与安装三、关于配置文件的一些重要说明四、配置登录账号和密码参考&#xff1a; 博客一、概念梳理 Mosquitto是一款实现了消息推送协议MQTT 3.1的开源消息代理软件&#xff0c;提供轻量级的、支持可订阅/可发布的消息推送模式&#xff0c;是设备与…

mf10ccwm芯片说明部分译文

MF10-N是一种通用的双二阶状态变量滤波器&#xff0c;其中心频率与应用于时钟输入&#xff08;fCLK&#xff09;的方波的频率成正比。通过将引脚12连接到适当的直流电压&#xff0c;滤波器中心频率fO可以等于fCLK/100或fCLK/50。通过使用晶体时钟振荡器可以非常精确地设置&…

《深入浅出计算机组成原理》学习笔记 Day5

动态链接1. 静态链接与动态链接2. 地址无关3. PLT 和 GOT参考1. 静态链接与动态链接 静态链接&#xff08;Static Link&#xff09;是通过合并代码段的方法来使程序装载至内存&#xff1b; 动态链接&#xff08;Dynamic Link&#xff09;则是链接加载到内存中的共享库&#xf…

数据结构之栈与队列详解

文章目录前言一、栈1.栈的概念及定义2.栈的实现&#xff08;1&#xff09;栈的结构&#xff08;2&#xff09;StackInit&#xff08;初始化&#xff09;&#xff08;3&#xff09;StackPush&#xff08;压栈&#xff09;&#xff08;4&#xff09;StackPop&#xff08;出栈&…

与众不同的异域年夜饭体验,你最中意哪一款?

年夜饭&#xff0c;中国人一年中最重要的一顿团圆聚餐&#xff0c;不仅丰富多彩&#xff0c;还充满了各种吉祥寓意。如果你选择的是出境旅游过春节&#xff0c;那么一次异域年夜饭体验也可以让你的旅行充满乐趣&#xff0c;收获与众不同的别样回忆。今天就跟着小旅城去看看&…

1597_AURIX_TC275_GPIO简介

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 左上角画出来的这个寄存器可以进行输入输出的控制。从右边上下拉设备这里可以看得出来&#xff0c;输入输出其实都是可以配置的。当端口配置为输入的时候&#xff0c;逻辑图中的输出驱动会…

使用文本编辑器编写Java源代码

使用文本编辑器编写Java源代码 编写JavaJavaJava应用程序&#xff0c;可以使用任何一个文本编辑器来编写程序的源代码&#xff0c;然后使用JDKJDKJDK搭配的工具进行编译和运行&#xff0c;在这里&#xff0c;我将介绍一个使用简单的文本编辑器来开发一个JavaJavaJava应用程序的…

【创业分享】2022年,仅赚几万,但却很踏实?

大家好&#xff0c;欢迎来到停止重构的频道。本期&#xff0c;我们停一下技术讨论&#xff0c;反思一下2022年的变化以及展望一下2023年。回顾2022这是我们以正式商业主体创业的第一年。总的来说&#xff0c;除了不赚钱和软件产品还没做出来以外&#xff0c;其实还不错。自媒体…

Linux常用命令——tcpreplay命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) tcpreplay 将PCAP包重新发送&#xff0c;用于性能或者功能测试 补充说明 简单的说&#xff0c;tcpreplay是一种pcap包的重放工具&#xff0c;它可以将用ethreal、wireshark工具抓下来的包原样或经过任意修改后…

Spark Core 编程入门,常用算子介绍

RDD的创建 如下代码&#xff0c;Spark RDD编程的入口对象是SparkContext对象(不论何种编程语言)&#xff0c;只有构建出SparkContext&#xff0c;基于它才能执行后续的API调用和计算 本质上&#xff0c;Spark Context对编程来说&#xff0c;主要功能就是创建第一个RDD出来 # …

JVM 垃圾回收(深入理解Java虚拟机第三章)

垃圾判断算法 引用计数法 每个对象增加引用计数器&#xff0c;引用加一&#xff0c;失效减一&#xff0c;为零判定为垃圾数据。 缺点&#xff1a;循环引用难以解决 根搜索算法 从树状引用链向下查找&#xff0c;如果对象无法找到&#xff0c;则标记为垃圾数据。 JVM算法 …

Java反射学习

反射的概念 Reflection(反射&#xff09;是Java被视为动态语言的关键 反射机制允许程序在执行期借助于Reflection API获得任何类的内部信息&#xff0c; 并能直接操作任意对象的内部属性及方法。 加载完类之后&#xff0c;在堆内存的方法区中就产生了一个Class类型的对象&…

【JavaEE】阻塞队列 + 生产者消费者模型

目录 阻塞队列 阻塞队列的使用 生产者消费者模型 模型的两个好处 1. 降低耦合 2. 削峰填谷 简单实现阻塞队列 阻塞队列 阻塞队列是在一般的队列上升级而来的。 对于队列为空时&#xff0c;如果还想取队列中的元素&#xff0c;此时阻塞队列就会进行阻塞。 对于队列为满时…

fpga的SD卡读BMP图片显示实验(SPI模式)

对于 SD 卡的 SPI 模式而言&#xff0c;采用的 SPI 的通信模式为模式 3&#xff0c;即 CPOL1&#xff0c;CPHA1&#xff0c;在 SD 卡 2.0 版本协议中&#xff0c;SPI_CLK 时钟频率可达 50Mhz。SD 卡的 SPI 模式&#xff0c;只用到了 SDIO_D3&#xff08;SPI_CS&#xff09;、SD…

Nacos 部署简单使用

文章目录1、前置相关知识及说明2、官网3、环境4、Nacos 和 Zookeeper、Eureka 的主要区别5、安装部署 & 启动5.1、Windows下载安装包部署单机部署集群部署测试6、使用服务端客户端 - SpringBoot 使用 Nacos Client7、运维健康检查获取配置&#xff0c;验证服务端是否正常异…

【DX-BT24蓝牙模块连接Arduino与手机透传教程】

【DX-BT24蓝牙模块连接Arduino与手机透传教程】1. 前言2. 接线3. 程序设计详解4. 演示效果5. 小结1. 前言 大夏龙雀科技DX-BT24&BT24-S&BT24-PA蓝牙模块,拥有5.1蓝牙协议,模块内置标准串口协议。前期设置蓝牙名称为VOR&#xff0c;采用默认波特率9600&#xff0c;详细…

JavaScript 入门基础 - 对象(五)

JavaScript 入门基础 - 对象 文章目录JavaScript 入门基础 - 对象1. 对象1.1 对象的基本理解1.2 为什么需要变量2. 创建对象的方式2.1 利用字面量创建对象2.2 变量属性函数方法的区别2.3 利用 new Object 创建对象2.4 利用构造函数创建对象3.new关键字4. 遍历对象属性5. JavaSc…