题解地址  https://www.acwing.com/problem/content/description/473/

有一个m×m的棋盘,棋盘上每一个格子可能是红色、黄色或没有任何颜色的。

你现在要从棋盘的最左上角走到棋盘的最右下角。 

任何一个时刻,你所站在的位置必须是有颜色的(不能是无色的),你只能向上、下、左、右四个方向前进。

当你从一个格子走向另一个格子时,如果两个格子的颜色相同,那你不需要花费金币;如果不同,则你需要花费1个金币。 

另外,你可以花费2个金币施展魔法让下一个无色格子暂时变为你指定的颜色。

但这个魔法不能连续使用,而且这个魔法的持续时间很短,也就是说,如果你使用了这个魔法,走到了这个暂时有颜色的格子上,你就不能继续使用魔法;只有当你离开这个位置,走到一个本来就有颜色的格子上的时候,你才能继续使用这个魔法,而当你离开了这个位置(施展魔法使得变为有颜色的格子)时,这个格子恢复为无色。 

现在你要从棋盘的最左上角,走到棋盘的最右下角,求花费的最少金币是多少?

输入格式

数据的第一行包含两个正整数m,n,以一个空格分开,分别代表棋盘的大小,棋盘上有颜色的格子的数量。  

接下来的n行,每行三个正整数x,y,c,分别表示坐标为(x,y)的格子有颜色c,其中c=1代表黄色,c=0代表红色。

相邻两个数之间用一个空格隔开。棋盘左上角的坐标为(1, 1),右下角的坐标为(m, m)。  

棋盘上其余的格子都是无色,保证棋盘的左上角,也就是(1,1)一定是有颜色的。

输出格式

输出一行,一个整数,表示花费的金币的最小值,如果无法到达,输出-1。

数据范围

1≤m≤1001≤m≤100,
1≤n≤10001≤n≤1000

输入样例:

5 7
1 1 0
1 2 0
2 2 1
3 3 1
3 4 0
4 4 1
5 5 0

输出样例:

8

 #include <iostream>
#include <vector> using namespace std; const int N = ;
vector<vector<int>> qipan(N, vector<int>(N, ));
vector<vector<int>> vis(N, vector<int>(N, ));
vector<vector<int>> mydistance(N, vector<int>(N, )); int m, n; // mm格子棋牌 n个有颜色的
int ans = ; int xchange[] = { -,,, };
int ychange[] = { ,,-, }; int CheckXY(int x, int y)
{
if (x < || x > m || y < || y > m || vis[x][y] == )
return ; return ;
} void dfs(int x,int y, int isMagic,int cost)
{
if (x == m && y == m && cost < ans) {
ans = cost;
return;
} if (cost >= mydistance[x][y]) {
//剪枝 如果现在开销已经大于经过这里的开销 则不必继续下去 因为开销会更大
return;
} mydistance[x][y] = cost; //向四个边扩展
for (int i = ; i < ; i++) {
int nx = x + xchange[i], ny = y + ychange[i];
if ( != CheckXY(nx, ny)) {
continue;
}
vis[nx][ny] = ; if (isMagic == ) {
//没施法情况
if (qipan[x][y] == qipan[nx][ny]) {
dfs(nx, ny, , cost);
}
else if (qipan[x][y] != qipan[nx][ny] && qipan[nx][ny] == ) {
qipan[nx][ny] = qipan[x][y];
dfs(nx, ny, , cost+);
qipan[nx][ny] = ;
}
else if (qipan[x][y] != qipan[nx][ny] && qipan[nx][ny] != ) {
dfs(nx, ny, , cost + );
}
}
else {
//上轮施法
if (qipan[nx][ny] == ) {
//连续两个无色块 返回
}
else if (qipan[nx][ny] != && qipan[nx][ny] == qipan[x][y]) {
dfs(nx, ny, , cost);
}
else if (qipan[nx][ny] != && qipan[nx][ny] != qipan[x][y]) {
dfs(nx, ny, , cost+);
}
}
vis[nx][ny] = ;
}
} void StartCal()
{
int x = ; int y = ;
int cost = ;
vis[][] = ;
dfs(x, y,,cost);
} //1 一个颜色 2 另一个颜色 0 无色
int main()
{
//std::cout << "Hello World!\n";
cin >> m >> n; while (n--) {
int x, y, c;
cin >> x >> y >> c;
qipan[x][y] = c+;
} StartCal(); if (ans != )
cout << ans;
else
cout << -; return ;
}
 直接dfs  不过能否施法有点绕,施法是指定一个周边格子变成自己所在的格子颜色。

acwing 471. 棋盘 解题记录的更多相关文章

  1. acwing 528. 奶酪 解题记录

    习题地址 https://www.acwing.com/problem/content/description/530/ 现有一块大奶酪,它的高度为h,它的长度和宽度我们可以认为是无限大的,奶酪中间有 ...

  2. pwnable.kr input解题记录

    pwnable input解题记录 给了源码如下: #include "stdio.h" #include "unistd.h" #include " ...

  3. angr脚本——以angrctf解题记录为参考

    angr脚本--以angrctf解题记录为参考 ​ angr是用于逆向工程中进行二进制分析的一个python框架 ​ 符号执行 (Symbolic Execution)是一种程序分析技术.其可以通过分 ...

  4. LeetCode解题记录(贪心算法)(二)

    1. 前言 由于后面还有很多题型要写,贪心算法目前可能就到此为止了,上一篇博客的地址为 LeetCode解题记录(贪心算法)(一) 下面正式开始我们的刷题之旅 2. 贪心 763. 划分字母区间(中等 ...

  5. ssrf解题记录

    ssrf解题记录 最近工作需要做一些Web的代码审计,而我Web方面还比较薄弱,决定通过一些ctf的题目打打审计基础,练练思维,在博客上准备开几个专题专门记录刷题的过程. pwn题最近做的也很少,也要 ...

  6. AcWing 791. 高精度加法 解题记录

    题目地址 https://www.acwing.com/problem/content/description/793/ 题目描述给定两个正整数,计算它们的和. 输入格式共两行,每行包含一个整数. 输 ...

  7. ACWING 95 费解的开关 解题记录

    你玩过“拉灯”游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏者可以改变它的状态.每一步,游戏者可以改变某一个灯的状态.游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也 ...

  8. 实验吧web解题记录

    自以为sql注入掌握的还是比较系统的,然而,做了这些题之后才发现,大千世界无奇不有,真是各种猥琐的思路...还是要多学习学习姿势跟上节奏 登录一下好吗?? http://ctf5.shiyanbar. ...

  9. LeetCode解题记录(贪心算法)(一)

    1. 前言 目前得到一本不错的算法书籍,页数不多,挺符合我的需要,于是正好借这个机会来好好的系统的刷一下算法题,一来呢,是可以给部分同学提供解题思路,和一些自己的思考,二来呢,我也可以在需要复习的时候 ...

随机推荐

  1. (七十七)c#Winform自定义控件-采样控件-HZHControls

    官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...

  2. WPF数据可视化-瀑布图

    实现方式一: 将数据(Point[])根据索引沿X轴使用虚拟画布进行绘制,每个数据绘制大小为1px * 1px:最终绘制出的宽度等于数据的总长度.标记并存储当前绘制的图为PreviousBitmap; ...

  3. C# 结合 PInvoke 对接 IP 摄像头的笔记

    最近做项目的时候,需要对接厂商提供的 IP 摄像头.但是他们只提供了 C++ 的 SDK,没办法,只能开始撸 C# 的 SDK Helper 类.本篇文章主要记录了对接 C++ DLL 需要注意的几个 ...

  4. How to: Use XPO Upcasting in XAF 如何:在 XAF 中使用 XPO 强制转换

    In this topic, you will learn how to use the Upcasting feature of XPO in XAF. It is useful when you ...

  5. English:2019100401_Suffix"ery"

    Ax_introduction source a Frech mean to "state,quality,act,place where etc" 1)After the ver ...

  6. Android项目实战之高仿网易云音乐项目介绍

    这一节我们来讲解这个项目所用到的一些技术,以及一些实现的效果图,让大家对该项目有一个整体的认识,推荐大家收藏该文章,因为我们发布文章后会在该文章里面加入链接,这样大家找着就很方便. 目录 第1章 前期 ...

  7. docker可视化工具Portainer部署与汉化

    为了更好的观察Docker运行状态,我们采用Portainer工具进行可视化,下面是部署过程总结: 环境: Liunx:CentOS Linux release 7.6.1810 (Core) Doc ...

  8. MySQL语句使用。

    目录 MySQL的DDL.DML.DQL语句和单表增.删.改.查 实验准备: 实验开始: DDL语句 DML语句 DQL语句 单表操作的分组统计 MySQL的DDL.DML.DQL语句和单表增.删.改 ...

  9. java.lang.IllegalStateException: getOutputStream() has already been called 解决办法

    因为在使用的时候没有使用@ResponseBody这个注解,所以才会报上面的异常

  10. 【oracle】ORA-00947: 没有足够的值

    insert 时 对应NOT NULL 的列 必须有值