题解地址  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

输入样例:

  1. 5 7
  2. 1 1 0
  3. 1 2 0
  4. 2 2 1
  5. 3 3 1
  6. 3 4 0
  7. 4 4 1
  8. 5 5 0

输出样例:

  1. 8
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. const int N = ;
  7. vector<vector<int>> qipan(N, vector<int>(N, ));
  8. vector<vector<int>> vis(N, vector<int>(N, ));
  9. vector<vector<int>> mydistance(N, vector<int>(N, ));
  10.  
  11. int m, n; // mm格子棋牌 n个有颜色的
  12. int ans = ;
  13.  
  14. int xchange[] = { -,,, };
  15. int ychange[] = { ,,-, };
  16.  
  17. int CheckXY(int x, int y)
  18. {
  19. if (x < || x > m || y < || y > m || vis[x][y] == )
  20. return ;
  21.  
  22. return ;
  23. }
  24.  
  25. void dfs(int x,int y, int isMagic,int cost)
  26. {
  27. if (x == m && y == m && cost < ans) {
  28. ans = cost;
  29. return;
  30. }
  31.  
  32. if (cost >= mydistance[x][y]) {
  33. //剪枝 如果现在开销已经大于经过这里的开销 则不必继续下去 因为开销会更大
  34. return;
  35. }
  36.  
  37. mydistance[x][y] = cost;
  38.  
  39. //向四个边扩展
  40. for (int i = ; i < ; i++) {
  41. int nx = x + xchange[i], ny = y + ychange[i];
  42. if ( != CheckXY(nx, ny)) {
  43. continue;
  44. }
  45. vis[nx][ny] = ;
  46.  
  47. if (isMagic == ) {
  48. //没施法情况
  49. if (qipan[x][y] == qipan[nx][ny]) {
  50. dfs(nx, ny, , cost);
  51. }
  52. else if (qipan[x][y] != qipan[nx][ny] && qipan[nx][ny] == ) {
  53. qipan[nx][ny] = qipan[x][y];
  54. dfs(nx, ny, , cost+);
  55. qipan[nx][ny] = ;
  56. }
  57. else if (qipan[x][y] != qipan[nx][ny] && qipan[nx][ny] != ) {
  58. dfs(nx, ny, , cost + );
  59. }
  60. }
  61. else {
  62. //上轮施法
  63. if (qipan[nx][ny] == ) {
  64. //连续两个无色块 返回
  65. }
  66. else if (qipan[nx][ny] != && qipan[nx][ny] == qipan[x][y]) {
  67. dfs(nx, ny, , cost);
  68. }
  69. else if (qipan[nx][ny] != && qipan[nx][ny] != qipan[x][y]) {
  70. dfs(nx, ny, , cost+);
  71. }
  72. }
  73. vis[nx][ny] = ;
  74. }
  75. }
  76.  
  77. void StartCal()
  78. {
  79. int x = ; int y = ;
  80. int cost = ;
  81. vis[][] = ;
  82. dfs(x, y,,cost);
  83. }
  84.  
  85. //1 一个颜色 2 另一个颜色 0 无色
  86. int main()
  87. {
  88. //std::cout << "Hello World!\n";
  89. cin >> m >> n;
  90.  
  91. while (n--) {
  92. int x, y, c;
  93. cin >> x >> y >> c;
  94. qipan[x][y] = c+;
  95. }
  96.  
  97. StartCal();
  98.  
  99. if (ans != )
  100. cout << ans;
  101. else
  102. cout << -;
  103.  
  104. return ;
  105. }
  1.  直接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. NSwag.AspNetCore常用功能介绍

    对于asp.net core 下的Swagger,之前一直用Swashbuckle的,因为官方推荐,再加上有老张的博客助力<从壹开始前后端分离[ .NET Core2.0/3.0 +Vue2.0 ...

  2. Spring 框架下的 JDBC

    Spring JDBC Spring 对JDBC技术规范做了进一步封装,它又叫Spring JDBCTemplate(jdbc模板技术) 纯JDBC:代码清晰的.效率最高.代码是最烦的.    Spr ...

  3. JS---DOM---点击操作---part2---14个案例

    案例1:点击按钮禁用文本框 <input type="button" value="禁用文本框" id="btn" /> < ...

  4. 误删mysql root账户

    看这个账户有点碍眼就删除了,结果异常了mysql> select user,host from mysql.user;+---------------+-------------+| user ...

  5. js对象数组中的某属性值 拼接成字符串

    js对象数组中的某属性值 拼接成字符串 var objs=[ {id:1,name:'张三'}, {id:2,name:'李四'}, {id:3,name:'王五'}, {id:4,name:'赵六' ...

  6. C# Winform更换Webbrowse为WebKit

    本人第一次发表博文,内容不精也不是很有水平,请大家多多包涵~ 说到Webbrowser,可能大家都用过这个控件,它默认使用的是旧版本IE内核. 这就导致了一些问题,比如JS的加载不正确,这个问题就足够 ...

  7. IDEA快捷键用法

    1.Ctrl+滑动滚轮调节窗口显示大小(需要设置之后方可) File->Settings->Editor->General->Change fontsize with Ctrl ...

  8. Spring源码解析-ioc容器的设计

    Spring源码解析-ioc容器的设计 1 IoC容器系列的设计:BeanFactory和ApplicatioContext 在Spring容器中,主要分为两个主要的容器系列,一个是实现BeanFac ...

  9. 【西北师大-2108Java】第十次作业成绩汇总

    [西北师大-2108Java]第十次作业成绩汇总 作业题目 面向对象程序设计(JAVA) 第12周学习指导及要求 实验目的与要求 (1)掌握Vetor.Stack.Hashtable三个类的用途及常用 ...

  10. git版本对比

    1.git diff版本比对 (未添加到暂存区间之前的区别对比) 未进行修改,则显示为空 进行文件修改,再执行git diff 当执行git add .  之后,再次git diff则为空 缓存和提交 ...