传送

这看起来有点像个搜索,那我们就用搜索试试。

dfs?bfs?

其实都可以,但是窝只会dfs.。

既然这里要用dfs,那么就要把每次搜到(m,m)时,使用的金币数量进行比较,取最小值。

在搜索过程中肯定会遇到很多不是最优解的情况。既然不是最优解,那么我们可以用某些方式在搜索过程中就把这些情况给剪掉。(也就是剪枝)我们不妨再开一个二维数组best,best[i][j]表示走到点(i,j)所用的最少金币数量。这样搜索到点(i,j)时,如果当前花费的金币总数不小于best[i][j],那么就算这种情况能够到达终点,它也一定不是最优解,所以我们直接返回,不再搜索。这样就可以节省很多的时间(至少不会TLE)

再考虑一些细节

这里我们就不判断每个点是否到过了,因为在上面的剪枝中,第二次到达一个搜索过的点,花费的金币肯定不比第一次到达时花费的少。

在搜索时,我们只搜索有颜色的点。对于那些可以使用魔法的无色格子,我们就直接把它设成有颜色的,并且标记已经使用过魔法。在回溯的时候再使它的颜色变为无色就好。

这里红色是0,黄色是1,而那些没有颜色的点的初始值也是0。所以我们在输入颜色的时候,将有颜色的点的颜色+1,就可以区分了。

代码:

#include<bits/stdc++.h>
using namespace std;
int m,n,ma[][],be[][];//be就是best,ma就是map(地图)
int dx[]={,-,,},dy[]={,,,-};
int read()//快读
{
char ch=getchar();
int x=;bool f=;
while(ch<''||ch>'')
{
if(ch=='-')f=;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=(x<<)+(x<<)+(ch^);
ch=getchar();
}
f?x=-x:x=x;
return x;
}
void dfs(int nowx,int nowy,int cost,bool magic)
{
if(nowx==m&&nowy==m)
{
be[m][m]=min(be[m][m],cost);
return ;
}
if(cost>=be[nowx][nowy])return ;
be[nowx][nowy]=cost;
for(int i=;i<=;i++)
{
int ex=nowx+dx[i],ey=nowy+dy[i];
if(ex>=&&ex<=m&&ey>=&&ey<=m)
{
if(ma[ex][ey]!=)//只搜索有颜色的点(无色可以覆盖成有色)
{
if(ma[ex][ey]==ma[nowx][nowy])
dfs(ex,ey,cost,);
else dfs(ex,ey,cost+,);
}
else if(magic==)//对于无色的点,看是否能使用魔法
{
ma[ex][ey]=ma[nowx][nowy];
dfs(ex,ey,cost+,);
ma[ex][ey]=;//一定要记得回溯啊
} }
}
}
int main()
{
m=read();n=read();
for(int i=;i<=n;i++)
{
int x=read(),y=read(),c=read();
c++;
ma[x][y]=c;
}
memset(be,,sizeof(be));
dfs(,,,);
if(be[m][m]<)//memset之后be的值是1061109567
printf("%d\n",be[m][m]);//be[m][m]就是最后的解
else printf("-1");
return ;
}

P3956棋盘的更多相关文章

  1. 洛谷 P3956 棋盘 解题报告

    P3956 棋盘 题目描述 有一个\(m×m\)的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在的位置必须是有颜色的(不能 ...

  2. 2017普及组D1T3 洛谷P3956 棋盘

    2017普及组D1T3 洛谷P3956 棋盘 原题 题目描述 有一个m×m的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在 ...

  3. P3956 棋盘——普及题,儿童搜索

    P3956 棋盘 这道搜索弄得我很难受. 第一,一定要看清楚题在写.第二,弄清楚判断条件: 首先图的大小是m*m不是n*m; 然后就是当前有颜色的点是不用变颜色的: #include<cstdi ...

  4. P3956 棋盘

    P3956 棋盘 题解 注释都在代码里了 这道题可以用DFS做,记忆化搜索,维护一个money[ ][ ] 表示到达当前节点的最小花费 不需要记录VIS,因为有一个最小值判断,如果走重复的话一定会得到 ...

  5. 【洛谷】【搜索(dfs)】P3956 棋盘

    题目传送门:戳 题目描述: 有一个 \(m * m\) 的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在的位置必须是有颜色 ...

  6. 洛谷 P3956 棋盘(BFS)

    传送门:Problem P3956 https://www.cnblogs.com/violet-acmer/p/9827010.html 题解: BFS 相关变量解释: color[maxn][ma ...

  7. 洛谷 P3956 棋盘

    题目描述 有一个m ×m的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在的位置必须是有颜色的(不能是无色的), 你只能向上 ...

  8. 洛谷 P3956 棋盘(记忆化搜索)

    嗯... 题目链接:https://www.luogu.org/problem/P3956 这是一道比较好搜的题,注意一些剪枝.预处理和魔法的处理问题(回溯). AC代码: #include<c ...

  9. 洛谷 P3956 棋盘 题解

    每日一题 day5 打卡 Analysis 深搜+剪枝+瞎jb判断 1.越界 2.这个点无色 3.当前的价值已经比答案大 三种情况要剪枝 我搜索里判断要不要施法的时候没判断上一次有没有施法,白调了0. ...

  10. 洛谷p3956 棋盘(NOIP2017 t3)

    在noip考场上本来以为只能骗暴力分,没想到最后A了: 本蒟蒻的做法比较简(zhi)单(zhang):记忆化深搜(考场上本来是想打广搜的,但我深搜稳一点就这样打了): 具体:每个点用一个f数组记录当前 ...

随机推荐

  1. SQL语句创建函数

    ----先create,再alter alter function fuc (@userid int,@strWhere varchar(max),@strWhere2 varchar(max) )  ...

  2. CentOS 7 关闭启动防火墙

    关闭firewall:systemctl stop firewalld.service #停止firewallsystemctl disable firewalld.service #禁止firewa ...

  3. 前端 CSS 一些标签默认有padding

    一个html body标签 默认有 margin外边距属性 比如ul标签,有默认的padding-left值. 那么我们一般在做站的时候,是要清除页面标签中默认的padding和margin.以便于我 ...

  4. windows10安装ipython

    Win10中如何装IPython?(其他Windows版本,如win7.win8/8.1也通用)我的这个方法比较简单,配置好环境变量敲几行命令就行了 .安装IPython的前提是已经安装好了Pytho ...

  5. SpringBoot jar程序配置成服务运行

    windows 版本 http://www.cppblog.com/aurain/archive/2014/01/23/205534.aspx linux 版本 https://blog.csdn.n ...

  6. Spring MVC @RequestBody自动转JSON HTTP415错误解决方法

    转自:http://blog.csdn.net/tiantiandjava/article/details/46125141 项目中想用@RequestBody直接接收json串转成对象 网上查了使用 ...

  7. Sentinel分布式系统的流量防卫兵

    Sentinel 是什么?官网:https://github.com/alibaba/Sentinel/wiki/介绍 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel 以流量 ...

  8. Java多态性应用——多态数组、多态参数

    多态数组: Person[] person = {new Person("张三", 32), new Student("李四", 21, 120, 90.0), ...

  9. React Hooks实现异步请求实例—useReducer、useContext和useEffect代替Redux方案

    本文是学习了2018年新鲜出炉的React Hooks提案之后,针对异步请求数据写的一个案例.注意,本文假设了:1.你已经初步了解hooks的含义了,如果不了解还请移步官方文档.(其实有过翻译的想法, ...

  10. python Calendar 模块导入及用法

    Calendar 是python 日历模块,此模块的函数都是日历相关的,例如打印某月的字符月历,星期之类的模块,下面剖析python Calendar 模块导入及用法. 1,python导入日历模块 ...