acwing 471. 棋盘 解题记录
题解地址 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. 棋盘 解题记录的更多相关文章
- acwing 528. 奶酪 解题记录
习题地址 https://www.acwing.com/problem/content/description/530/ 现有一块大奶酪,它的高度为h,它的长度和宽度我们可以认为是无限大的,奶酪中间有 ...
- pwnable.kr input解题记录
pwnable input解题记录 给了源码如下: #include "stdio.h" #include "unistd.h" #include " ...
- angr脚本——以angrctf解题记录为参考
angr脚本--以angrctf解题记录为参考 angr是用于逆向工程中进行二进制分析的一个python框架 符号执行 (Symbolic Execution)是一种程序分析技术.其可以通过分 ...
- LeetCode解题记录(贪心算法)(二)
1. 前言 由于后面还有很多题型要写,贪心算法目前可能就到此为止了,上一篇博客的地址为 LeetCode解题记录(贪心算法)(一) 下面正式开始我们的刷题之旅 2. 贪心 763. 划分字母区间(中等 ...
- ssrf解题记录
ssrf解题记录 最近工作需要做一些Web的代码审计,而我Web方面还比较薄弱,决定通过一些ctf的题目打打审计基础,练练思维,在博客上准备开几个专题专门记录刷题的过程. pwn题最近做的也很少,也要 ...
- AcWing 791. 高精度加法 解题记录
题目地址 https://www.acwing.com/problem/content/description/793/ 题目描述给定两个正整数,计算它们的和. 输入格式共两行,每行包含一个整数. 输 ...
- ACWING 95 费解的开关 解题记录
你玩过“拉灯”游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏者可以改变它的状态.每一步,游戏者可以改变某一个灯的状态.游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也 ...
- 实验吧web解题记录
自以为sql注入掌握的还是比较系统的,然而,做了这些题之后才发现,大千世界无奇不有,真是各种猥琐的思路...还是要多学习学习姿势跟上节奏 登录一下好吗?? http://ctf5.shiyanbar. ...
- LeetCode解题记录(贪心算法)(一)
1. 前言 目前得到一本不错的算法书籍,页数不多,挺符合我的需要,于是正好借这个机会来好好的系统的刷一下算法题,一来呢,是可以给部分同学提供解题思路,和一些自己的思考,二来呢,我也可以在需要复习的时候 ...
随机推荐
- NSwag.AspNetCore常用功能介绍
对于asp.net core 下的Swagger,之前一直用Swashbuckle的,因为官方推荐,再加上有老张的博客助力<从壹开始前后端分离[ .NET Core2.0/3.0 +Vue2.0 ...
- Spring 框架下的 JDBC
Spring JDBC Spring 对JDBC技术规范做了进一步封装,它又叫Spring JDBCTemplate(jdbc模板技术) 纯JDBC:代码清晰的.效率最高.代码是最烦的. Spr ...
- JS---DOM---点击操作---part2---14个案例
案例1:点击按钮禁用文本框 <input type="button" value="禁用文本框" id="btn" /> < ...
- 误删mysql root账户
看这个账户有点碍眼就删除了,结果异常了mysql> select user,host from mysql.user;+---------------+-------------+| user ...
- js对象数组中的某属性值 拼接成字符串
js对象数组中的某属性值 拼接成字符串 var objs=[ {id:1,name:'张三'}, {id:2,name:'李四'}, {id:3,name:'王五'}, {id:4,name:'赵六' ...
- C# Winform更换Webbrowse为WebKit
本人第一次发表博文,内容不精也不是很有水平,请大家多多包涵~ 说到Webbrowser,可能大家都用过这个控件,它默认使用的是旧版本IE内核. 这就导致了一些问题,比如JS的加载不正确,这个问题就足够 ...
- IDEA快捷键用法
1.Ctrl+滑动滚轮调节窗口显示大小(需要设置之后方可) File->Settings->Editor->General->Change fontsize with Ctrl ...
- Spring源码解析-ioc容器的设计
Spring源码解析-ioc容器的设计 1 IoC容器系列的设计:BeanFactory和ApplicatioContext 在Spring容器中,主要分为两个主要的容器系列,一个是实现BeanFac ...
- 【西北师大-2108Java】第十次作业成绩汇总
[西北师大-2108Java]第十次作业成绩汇总 作业题目 面向对象程序设计(JAVA) 第12周学习指导及要求 实验目的与要求 (1)掌握Vetor.Stack.Hashtable三个类的用途及常用 ...
- git版本对比
1.git diff版本比对 (未添加到暂存区间之前的区别对比) 未进行修改,则显示为空 进行文件修改,再执行git diff 当执行git add . 之后,再次git diff则为空 缓存和提交 ...