【NOIP2017】【Luogu P3956】【SPFA】棋盘
本题是一道简单的SPFA
具体看程序
#include<iostream>
#include<cstdio>
using namespace std;
const int wayx[4]={1,0,-1,0},wayy[4]={0,1,0,-1};//4个方向
int n,m,cost[200][200],a[200][200],magic[200][200],x,y,c;
bool visit[200][200];//标志某个点有没有在队列里面
struct data
{
int x,y;
}que[100000];//队列内的点的坐标
void first()
{
for (int i=1;i<=m;i++)
for (int j=1;j<=m;j++)
cost[i][j]=2147483640;
cost[1][1]=0;
//初始化,起点价值为0,其他均为无穷大
}
void spfa()//程序主体 SPFA
{
int head=0,tail=1;
que[head].x=1;que[head].y=1;
visit[1][1]=true;
while (head!=tail)
{
int nowx=que[head].x,nowy=que[head].y;
if (magic[nowx][nowy]) a[nowx][nowy]=magic[nowx][nowy];
//如果这个点用过魔法,那么让这个点标记为变的颜色
for (int i=0;i<4;i++)
{
int movex=nowx+wayx[i],movey=nowy+wayy[i],nowc=0;
if (movex<0||movex>m) continue;
if (movey<0||movey>m) continue;
//防止越界
if (a[movex][movey]==1&&a[nowx][nowy]==2) nowc+=1;
if (a[movex][movey]==2&&a[nowx][nowy]==1) nowc+=1;
if (a[movex][movey]==0)
{
if (magic[nowx][nowy]) nowc=cost[movex][movey]-cost[nowx][nowy]+1;
else
{
nowc+=2;
}
}
if (cost[movex][movey]>cost[nowx][nowy]+nowc)//松弛
{
if (!visit[movex][movey])
{
que[tail].x=movex;
que[tail].y=movey;
tail++;
visit[movex][movey]=true;
}
cost[movex][movey]=cost[nowx][nowy]+nowc;
if (nowc==2) magic[movex][movey]=a[nowx][nowy];
}
}
visit[nowx][nowy]=false;
if (magic[nowx][nowy]) a[nowx][nowy]=0;
magic[nowx][nowy]=0;
head++;
}
}
int main()
{
cin>>m>>n;
for (int i=1;i<=n;i++)
{
cin>>x>>y>>c;
a[x][y]=c+1;
}
first();
spfa();
if (cost[m][m]==2147483640) cout<<-1;//即没有路径可以到达终点
else cout<<cost[m][m];
return 0;
}
【NOIP2017】【Luogu P3956】【SPFA】棋盘的更多相关文章
- [luogu P1169] [ZJOI2007]棋盘制作
[luogu P1169] [ZJOI2007]棋盘制作 题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的 ...
- [luogu]P1169 [ZJOI2007]棋盘制作[DP][单调栈]
[luogu]P1169 [ZJOI]棋盘制作 ——!x^n+y^n=z^n 题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋 ...
- 悬线法 || BZOJ 1057: [ZJOI2007]棋盘制作 || Luogu P1169 [ZJOI2007]棋盘制作
题面:P1169 [ZJOI2007]棋盘制作 题解: 基本是悬线法板子,只是建图判断时有一点点不同. 代码: #include<cstdio> #include<cstring&g ...
- 【洛谷p3956】棋盘
日常blog(✧◡✧) 棋盘[题目链接] 算法: 然后这是2017普及组: first.关于颜色处理:让c[i][j]=color+1:这样无色=0,红色=1,黄色=2: 然后其实是记忆化,将记答案的 ...
- Luogu 1169 [ZJOI2007]棋盘制作 - 动态规划+单调栈
Description 给一个01矩阵, 求出最大的01交错的正方形和最大的01交错的矩阵 Solution 用动态规划求出最大的正方形, 用单调栈求出最大的矩阵. 在这里仅介绍求出最大正方形(求最大 ...
- 【Luogu】P1169棋盘制作(单调栈)
题目链接 唉……这种题放在NOIP以前我是会做的……但是为什么现在反而不会了…… 单调栈.预处理每个点向上能扩展的最大距离,左右用两遍单调栈扫一遍.注意边界. #include<cstdio&g ...
- [NOIp2017] luogu P3952 时间复杂度
跪着看评测很优秀. 题目描述 给你若干个程序,这些程序只有 For 循环,求这些程序的时间复杂度. Solution 大模拟.讲下细节. flag[i]flag[i]flag[i] 表示第 iii 位 ...
- luogu 1169 [ZJOI2007]棋盘制作 悬线dp
悬线法,虽然得不到局部最优解,但是一定能得到全局最优解的算法,十分神奇~ #include <cstdio> #include <algorithm> #define N 20 ...
- 【Luogu】P1436 棋盘分割 题解
嗯,点开题目,哇!是一道闪亮亮的蓝题! 不要被吓到了,其实,这道题就是一个简单的DP啦! 我们设 \(f[x1][y1][x2][y2][c]\) 为以 \((x1,y1)\) 为左上角,以 \((x ...
随机推荐
- JVM学习记录1--JVM内存布局
先上个图 这是根据<Java虚拟机规范(第二版)>所画的jvm内存模型. 程序计数器:程序计数器是用来记录当前线程方法执行顺序的,对应的就是我们编程中一行行代码的执行顺序,如分支,跳转,循 ...
- Python 中的for....else....
在一个for循环中,当循环遇到break语句之后程序就会跳出循环,执行for循环之后的语句:但是,当整个循环都没有遇上break语句,而且你想在这种情况下做一些事情的话,你就可以通过结合else来完成 ...
- MyBatis的几个重要概念和工作流程
MyBatis 几个重要的概念 Mapper 配置: Mapper 配置可以使用基于 XML 的 Mapper 配置文件来实现,也可以使用基于 Java 注解的 MyBatis 注解来实现,甚至可以直 ...
- python全局变量及局部变量
变量作用域 全局变量(global):在函数外部定义,在整个全局范围都有效 局部变量(local) 在函数内部定义,局部变量在局部范围内使用 数字,字符串,元组,修改其变量值时需要加globle,列表 ...
- Angular开发规范
目录 一. 前言 1.1. 规范目的 1.2. 局限性 二. 文件规范 2.1. 文件结构约定 2.2. 单一职责原则 ...
- 易初大数据 2019年11月13日 Linux 王庆超
★安装Red Hat Enterprise Linux7.41 ◆1通过键盘的方向键选择“lnstall Red Hat Enterprise Linux7.4”选项来直接安装Linux 系统. ◆2 ...
- SqlServer设置特定用户操作特定表(插入、删除、更新、查询 的权限设置)
目录 一.需求场景: 二.操作步骤: 表上右键选择[属性],选择[权限]选项卡: 点击[搜索],在弹出的框中点击[浏览],选择需要设置的用户: 在上面点击[确定]后,就可以在[权限]选项卡中看到权限列 ...
- 别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】
目录 1.什么是类的加载(类初始化) 2.类的生命周期 3.接口的加载过程 4.解开开篇的面试题 5.理解首次主动使用 6.类加载器 7.关于命名空间 8.JVM类加载机制 9.双亲委派模型 10.C ...
- 关于jQuery easyUI 添加合计统计行
首先在onLoadSuccess中添加计算函数:计算方法按各自业务需要,我做了一个判断非数 然后再在gatagrid表格添加行,$('#div').datagrid('appendRow', {... ...
- C++对象模型结论
C++对象模型 1.C++对象模型探讨的是对象成员存储问题. 2.结论: (1) .类内部的函数(静态成员函数,非静态成员函数)都不在对象内部 ,不占用对象大小. (2) 类内部的静态变量不占用对象大 ...