首页 > 其他分享 >刷题笔记:Luogu P3956 棋盘

刷题笔记:Luogu P3956 棋盘

时间:2023-05-24 17:36:26浏览次数:49  
标签:棋盘 颜色 int Luogu vis include P3956 刷题

Problem

Solution

DFS/BFS

需要注意去重的时候可以重复走(因为有限定条件),只要新的步数比原来的步数小就可以走,其余情况模拟即可

细节有点多,比如需要记录一下上一步的棋盘颜色(下一次搜索传递参数),因为牵扯到使用魔法问题,不能直接染,因为改变地图后后边很多操作都会受影响

在列举可能性的时候需要注意如果棋盘没颜色且不满足使用魔法,在列举颜色不同条件时需要特判棋盘有颜色 被卡了2 days啊

然后实现的时候注意细节,然后就没有然后了

Code

// By SXqwq
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define N 1010
#define INF 0x3f3f3f3f
using namespace std;
int m,n;
int mapp[N][N];
int vis[N][N];
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
void dfs(int x,int y,int val)
{
    if(vis[x][y]>vis[m][m]) return; //剪枝
    for(int i=0;i<4;i++)
    {
        int ax = x + dx[i];
        int ay = y + dy[i];
        if(!(ax>=1&&ax<=m&&ay>=1&&ay<=m)) continue;
        if(!mapp[ax][ay] && vis[x][y] + 2 < vis[ax][ay] && mapp[x][y])
        {
            vis[ax][ay] = vis[x][y] + 2;
            dfs(ax,ay,val);
        }
        else if(mapp[ax][ay] == val && vis[x][y] < vis[ax][ay])
        {
            vis[ax][ay] = vis[x][y];
            dfs(ax,ay,val);
        }
        else if(mapp[ax][ay] != val && mapp[ax][ay] && vis[x][y] + 1 < vis[ax][ay]) //注意特判棋盘有颜色!
        {
            vis[ax][ay] = vis[x][y] + 1;
            dfs(ax,ay,mapp[ax][ay]);
        }
    }
}
int main()
{
    memset(vis,INF,sizeof(vis));
    scanf("%d%d",&m,&n);
    for(int i=1;i<=n;i++)
    {
        int x,y,c;
        scanf("%d%d%d",&x,&y,&c);
        mapp[x][y] = c+1;
    }
    vis[1][1] = 0;
    dfs(1,1,mapp[1][1]);
    if(vis[m][m] == INF) cout<<"-1"<<endl;
    else cout<<vis[m][m]<<endl;
    return 0;
}

标签:棋盘,颜色,int,Luogu,vis,include,P3956,刷题
From: https://www.cnblogs.com/SXqwq/p/17428978.html

相关文章

  • 23-05-23 刷题
    练习刷题思路722.删除注释-力扣(LeetCode)【Mid】思路:不难,但是细节比较多。要理清楚有点麻烦。【题目不好】classSolution{publicList<String>removeComments(String[]source){List<String>ans=newArrayList<>();booleaninBlock=fals......
  • 算法刷题记录:NC22227 约瑟夫环
    题目链接https://ac.nowcoder.com/acm/problem/22227解题思路模拟环。这道题顺序数就行,顺序是逆时针,逆时针的箭头是往左拐的,变成直线后趋于正半轴所以是+。不过,这道模拟环并没有说从idx号开始,往左/右数几个人,所以不需要考虑+或-。因为不会越界,所以也不用额外%n。AC代码......
  • Luogu P2801 教主的魔法(Loj 数列分块入门 2)
    教主的魔法题目描述教主最近学会了一种神奇的魔法,能够使人长高。于是他准备演示给XMYZ信息组每个英雄看。于是\(N\)个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为\(1,2,\ldots,N\)。每个人的身高一开始都是不超过\(1000\)的正整数。教主的魔法每次可以把闭......
  • 23-05-20 刷题
    练习英文描述算法88.MergeSortedArray-LeetCode【easy】classSolution{publicvoidmerge(int[]nums1,intm,int[]nums2,intn){//twopointers,initiallyi,jpointstothelastnumberofthearray(m-1,n-1)//usektorecordth......
  • Luogu P5643 [PKUWC2018]随机游走
    题意给出一棵\(n\)结点树,从结点\(x\)出发,每次从当前点的所有边中选一条走过去,\(Q\)次询问给定一个点集\(S\),随机游走直到经过\(S\)中的每一个点至少一次的期望总步数,出发点\(x\)默认在开始时已经被经过。\(n\le18,Q\le5000\)解法萌新第一次见到这种题,感觉很神。......
  • Luogu P3978 [TJOI2015] 概率论
    定义\(f_i\)为\(i\)个节点组成的二叉树数量,\(g_i\)为\(i\)个节点组成的二叉树的叶子节点个数之和设当前\(i\)个节点组成的二叉树有\(a\)个叶子,容易发现分别删掉其中的\(1\)个叶子节点就能得到一个对应的\(i-1\)个节点的二叉树,总共会有\(a\)颗,可以发现每一个叶......
  • Luogu P5664 [CSP-S2019] Emiya 家今天的饭
    发现“每种主要食材至多在\(\lfloor\frac{k}{2}\rfloor\)个菜中被使用”有一个性质,在不合法的情况下绝对只有\(1\)个主要食材的个数\(>\lfloor\frac{k}{2}\rfloor\),因为\(k-\lfloor\frac{k}{2}\rfloor-1\le\lfloor\frac{k}{2}\rfloor\)然后就能发现算不合法......
  • 刷题笔记:Luogu P3743
    题目传送门Solution最多能将这些设备一起使用多久,显然答案满足单调性(如果\(x<y\)而不能使用\(x\)时间则一定不能使用\(y\)时间)通俗一点,就是前边的时间不满足则后边一定不满足,也就是局部答案舍弃性,考虑二分时间至于check怎么写呢?和奶牛晒衣服有异曲同工之妙,若设二分出来的时间......
  • re刷题记录
    re刷题记录[SWPUCTF2021新生赛]re1无壳,直接ida打开,main找到关键语句 f5查看伪代码 选中代码中的一些数字并按“R”,可以查看对应的字符strcmp()函数:strcmp函数是stringcompare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,st......
  • 刷题笔记:Luogu P1083 借教室
    题目传送门让结果最接近\(s\)值,显然我们要二分\(w\),check的写法可以直接暴力模拟,如果check(mid)<s则将r右移(通过读公式可以知道\(w\)越小检验值\(y\)就越大)但是这样会TLE,再读一下柿子:\(y_i=\sum\limits_{j=l_i}^{r_i}[w_j\geW]\times\sum\limits_{j=l_i}^{r_i}[w_j\geW]......