日常blog(✧◡✧)

棋盘【题目链接】

算法:

然后这是2017普及组;


first.关于颜色处理:让c[i][j]=color+1;这样无色=0,红色=1,黄色=2;

然后其实是记忆化,将记答案的数组先初始化为一个很大的数(我初始为了0x3f3f3f3f);

second.dfs主体部分:

1.四个变量:

x,y 存储搜索到的点的位置;

num 存储当前花费

used 存储是否使用过魔法;

2.几个返回的边界

①.当走出地图时,return;

②.当前搜到的值不如之前搜到的优(也包括相同的情况,如果不加相同的情况,重复的会反复搜),return;

③.当搜到最右下(m,m)时,先判断当前搜到的值是否优于之前的值(其实我赶脚不用判断qwq啊亲测不用)因为如果当前值不够优早在②就会被return;

所以如果能递归进判断的,一定更优,那么直接更新就好了;

3.真.主体部分:

1.向四个方向搜索(介里也是很像广搜了)

如果拓展后的节点有颜色,那么判断拓展的节点与当前节点的颜色是否相同

相同的话,花费就不需要增加,直接dfs(xx,yy,num,0);

不同的话,花费需要加1,dfs(xx,yy,num+1,0);

如果拓展节点没有颜色,那么判断当前节点是不是使用过魔法的点,如果是使用过魔法的点,那么显然走不下去了,如果未使用过魔法,就使用巴啦啦能量,把拓展节点变成与当前节点相同的颜色,dfs(xx,yy,num+2,1);

最后不要忘记回溯:c[xx][yy]=0;

判断无解:

如果无解,ans的值就不会更新,为0x3f3f3f3f,如果dfs完,ans=0x3f3f3f3f,说明无解,否则有解,输出ans;

CODE:

#include<bits/stdc++.h>

using namespace std;

inline int read(){
int ans=;
char last=' ',ch=getchar();
while(ch>''||ch<'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=(ans<<)+(ans<<)+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} int m,n;
int c[][],a[][];
int ans=0x3f3f3f3f;
int dx[]={,,-,,};
int dy[]={,,,,-}; void dfs(int x,int y,int num,int used){
if(x<||y<||y>m||x>m) return;
if(num>=a[x][y]) return;
a[x][y]=num;
if(x==m&&y==m){
ans=num;
return;
}
for(int i=;i<=;i++){
int xx=x+dx[i],yy=y+dy[i];
if(c[xx][yy]){//have color
if(c[xx][yy]==c[x][y]) dfs(xx,yy,num,);
else dfs(xx,yy,num+,);
}
else {
if(!used){
c[xx][yy]=c[x][y];
dfs(xx,yy,num+,);
c[xx][yy]=;
}
}
}
} int main(){
memset(a,,sizeof(a));
m=read();n=read();
int x,y,color;
for(int i=;i<=n;i++){
x=read();y=read();color=read();
c[x][y]=color+;//no color:0
//red color:1 yellow color:2
}
dfs(,,,);
if(ans==0x3f3f3f3f) printf("-1");
else printf("%d",ans);
return ;
}

end-

【洛谷p3956】棋盘的更多相关文章

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

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

  2. 洛谷 P3956 棋盘 解题报告

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

  3. 洛谷 P3956 棋盘(BFS)

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

  4. 洛谷 P3956 棋盘

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

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

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

  6. 洛谷 P3956 棋盘 题解

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

  7. 洛谷p3956 棋盘(NOIP2017 t3)

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

  8. 洛谷P1436 棋盘分割

    洛谷题目链接 动态规划: 我们设状态$f[i][j][o][p][k]$表示一个矩形,左上角顶点坐标为$(i,j)$,右下角顶点坐标为$(o,p)$时分割了$k$次,也就是说现在是$k+1$块 我们考 ...

  9. 洛谷 P1436 棋盘分割 解题报告

    P1436 棋盘分割 题目描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的两部分中的任意一块继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共 ...

随机推荐

  1. css将两个元素水平对齐,兼容IE8

    css实现元素水平对齐 css实现水平对齐,如图 有人会说css实现这种水平对齐要兼容ie8还不简单吗?使用float: left,或者display: inline-block,不就可以了吗?是的, ...

  2. Oracle 9i,10g,11g各自alert日志的位置

    10g&9i的alert日志: 进入oracle:[zhangshengdong@oralocal1 ~]$ sudo su - oracle[oracle@oralocal1 ~]$ sql ...

  3. 细数不懂Spring底层原理带来的伤与痛

    原文链接:https://www.jianshu.com/p/c9de414221ac?utm_campaign=haruki&utm_content=note&utm_medium= ...

  4. 借助tcpdump统计http请求

    借助tcpdump统计http请求     这里所说的统计http请求,是指统计QPS(每秒请求数),统计前十条被访问最多的url.一般做这样的统计时,我们经常会使用网站访问日志来统计.当我们来到一个 ...

  5. 【Linux】CentOS6安装jdk1.8

    1.查看官网下载地址 接受协议后,点击下载链接 查看发出的请求,获得下载地址 其中后面的AuthParam参数为本次下载的即时参数,每次都不一样 2.下载安装包 下载完后改个名 wget https: ...

  6. 【leetcode】1124. Longest Well-Performing Interval

    题目如下: We are given hours, a list of the number of hours worked per day for a given employee. A day i ...

  7. 系统符号二——正则表达式及三剑客之grep

    一基础正则表达式 (一)^  匹配以什么开头的信息 [root@centos71 ~]# grep "^root" /etc/passwd root:x:0:0:root:/roo ...

  8. div拖拽到iframe上方 导致 缩放和拖拽的不平滑和鼠标事件未放开 解决方法

    思路一:用在开始进行缩放(触发了resizable的start事件)为iframe添加z-index属性,将iframe放置在最下层. $("#draggable").resiza ...

  9. JS基础篇--sort()方法的用法,参数以及排序原理

    JS基础篇--sort()方法的用法,参数以及排序原理   sort() 方法用于对数组的元素进行排序,并返回数组.默认排序顺序是根据字符串Unicode码点.语法:arrayObject.sort( ...

  10. APK文件结构和安装过程

    APK文件结构Android应用是用Java编写的,利用Android SDK编译代码,并且把所有的数据和资源文件打包成一个APK (Android Package)文件,这是一个后缀名为.apk的压 ...