题解地址  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. How to: Generate XPO Business Classes for Existing Data Tables 如何:为现有数据表生成 XPO 业务类

    From the Tutorial and other documentation sources, you learned how to create business classes for yo ...

  2. 关于 IIS Express 常用设置

    关于 IIS Express 常用设置 站点绑定 IIS Express Web 服务器默认只绑定了 localhost 的主机名,这就意味着无法通过内网或其他自定义域名进行访问,可通过如下操作添加其 ...

  3. SAP QM 检验批里某检验特性的取样数量跟检验计划设置不符?

    SAP QM 检验批里某检验特性的取样数量跟检验计划设置不符? 如下检验批号 890000045939, 结果录入界面,第二个特性里,取样数量是50个.实际上,该检验批对应的检验计划里, 采样过程L- ...

  4. navicat连接不上Linux服务器上的mysql的解决办法

    一开始,心情是沉痛的,截图如下: 转载请注明出处:https://www.cnblogs.com/NaughtyCat/p/how-to-connect-to-mysql-on-linux-by-na ...

  5. Java8_map新增方法

    参考博客 https://irusist.github.io/2016/01/04/Java-8%E4%B9%8BMap%E6%96%B0%E5%A2%9E%E6%96%B9%E6%B3%95/#ge ...

  6. C++ explicit关键字,修饰构造函数,ctor

    #include <iostream> // operator Type() 类型操作符重载 // operator int() // operator double() // ... / ...

  7. Java之线程安全

    什么是线程安全? 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 什么是线程安全问题? ...

  8. typescript与nodejs(一)最简单的webserver

    安装nodejs tsc cnpm vscode 这些略 如果网络慢,可以考虑使用CNPM 一. 基本WebServer模块环境 1. 命令行  npm init 初始化一个目录为nodejs项目 2 ...

  9. jQuery 源码解析(二十七) 样式操作模块 坐标详解

    样式操作模块可用于管理DOM元素的样式.坐标和尺寸,本节讲解一下坐标这一块. 对于坐标来说,jQuery提供了一个offset方法用于获取第一个匹配元素的坐标或者设置所有匹配元素的坐标,还有offse ...

  10. Github新项目Dress(好耶是女装)

    面向可爱的蓝孩子 (/ω\) 的 git 学习实践项目,包含了600多位蓝孩子的女装照,访问前做好心理准备. 每个人都可以成为这个项目的参与者 访问地址:https://github.com/kome ...