首页 > 其他分享 >20241201每日一题洛谷P1683

20241201每日一题洛谷P1683

时间:2024-12-01 13:54:20浏览次数:5  
标签:P1683 洛谷 块砖 ty int DFS 桃花岛 瓷砖 20241201

普及-每日一题洛谷P1683

题目描述

不是任何人都可以进入桃花岛的,黄药师最讨厌像郭靖一样呆头呆脑的人。所以,他在桃花岛的唯一入口处修了一条小路,这条小路全部用正方形瓷砖铺设而成。有的瓷砖可以踩,我们认为是安全的,而有的瓷砖一踩上去就会有喷出要命的毒气,那你就死翘翘了,我们认为是不安全的。你只能从一块安全的瓷砖上走到与他相邻的四块瓷砖中的任何一个上,但它也必须是安全的才行。

由于你是黄蓉的朋友,她事先告诉你哪些砖是安全的、哪些砖是不安全的,并且她会指引你飞到第一块砖上(第一块砖可能在任意安全位置),现在她告诉你进入桃花岛的秘密就是:如果你能走过最多的瓷砖并且没有死,那么桃花岛的大门就会自动打开了,你就可以从当前位置直接飞进大门了。

注意:瓷砖可以重复走过,但不能重复计数。

输入格式

第一行两个正整数 \(W\) 和 \(H\),分别表示小路的宽度和长度。

以下 \(H\) 行为一个 \(H\times W\) 的字符矩阵。每一个字符代表一块瓷砖。其中,. 代表安全的砖,# 代表不安全的砖,@ 代表第一块砖。

输出格式

输出一行,只包括一个数,即你从第一块砖开始所能安全走过的最多的砖块个数(包括第一块砖)。

样例输入

11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........

样例输出

59

数据规模与约定

对于全部的测试点,保证 \(1 \leq W,H\le 20\)。

DFS搜索,每次记录没有走过的瓷砖数

地图的读入,使用%s字符串读入每一行

scanf("%d %d",&w,&h);
for (int i=0;i<h;i++)
    scanf("%s",g[i]);

遍历地图找到@起点,开始搜索

for (int i=0;i<h;i++)
     for (int j=0;j<w;j++)
         if (g[i][j]=='@')
             dfs(i,j);

定义向量,连通四个方向

int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};

DFS搜索函数

void dfs(int x,int y){
    for (int i=0;i<4;i++){
        int tx=x+dx[i],ty=y+dy[i];
        if (tx<0||tx>=h||ty<0||ty>=w) continue;//超过地图边界,该路径无效
        if (g[tx][ty]!='.') continue;//非'.'不走
        if (st[tx][ty]) continue;//之前走过的路径不走
        st[tx][ty]=1;
        ans++;
        dfs(tx,ty);
    }
}

每次DFS都遍历四个可连通的方向,判断路径是否合法

st数组记录之前走过的路径,不能走回头路,回溯会重复经过节点

1 -> 2 ->3 -> 4
         5

当 4 走不通时,直接结束当前状态的DFS,回退到上一层DFS,即在 3 处考虑,此时 4 的路径已经被标记过了

相当于:

1,2,3,4 -> 1,2,3,5 //直接从3考虑
而不是
1,2,3,4 -> 1,2,3 -> 1,2,3,5 //回溯多经过了一次3节点

标签:P1683,洛谷,块砖,ty,int,DFS,桃花岛,瓷砖,20241201
From: https://www.cnblogs.com/dianman/p/18579750

相关文章

  • 洛谷 P1036 [NOIP2002 普及组] 选数 C语言
    题目:https://www.luogu.com.cn/problem/P1036题目描述已知 nn 个整数 x1,x2,⋯ ,xn,以及 1 个整数 k(k<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。例如当 n=4,k=3,4 个整数分别为 3,7,12,19时,可得全部的组合与它们的和为:3+7+12=223+7+19=297+12......
  • 洛谷 奇怪的电梯
    1.题目描述呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N)上有一个数字Ki​(0≤Ki​≤N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3,3,1,2,5代表了Ki......
  • 洛谷 P1605 迷宫 C语言 bfs
    题目:https://www.luogu.com.cn/problem/P1605题目描述给定一个 N×M方格的迷宫,迷宫里有 TT 处障碍,障碍处不可通过。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到......
  • C语言 神奇的幻方(洛谷 p2615 )幻方是一种很神奇的N*N矩阵
            题目:神奇的幻方(洛谷p2615)幻方是一种很神奇的N*N矩阵:它由数字1,2,3,…,N*N构成,且每行、每列及两条对角线上的数字之和都相等。当N为奇数时,可以通过以下方法构建一个幻方:首先将1写在第一行的中间;之后,按如下方式从小到大依次填写每个数k(k=2,3,…,N*N)若(k-1)在第一......
  • 【洛谷】P2089 烤鸡
    #include<iostream>usingnamespacestd;intmain(){ intn,a,b,c,d,e,f,g,h,i,j,num=0; cin>>n; for(a=1;a<=3;a++) { for(b=1;b<=3;b++) { for(c=1;c<=3;c++) { for(d=1;d<=3;d++) { for(e=1;e<=3;e++) { ......
  • 洛谷 P1680 奇怪的分组(组合数学)
    题目传送门https://www.luogu.com.cn/problem/P1680解题思路这是一道组合数学题。既然题目说了第  个组要大于  个人,那我们不妨先给每个组分  个人。但题目说了是大于  个人,我们只给每个组分了  个人,所以还得分几个人。那么问题就变成了:对于剩下的  个人,我们......
  • 洛谷 P2895 [USACO08FEB] Meteor Shower S C语言 bfs
    题目:https://www.luogu.com.cn/problem/P2895题目描述贝茜听说一场特别的流星雨即将到来:这些流星会撞向地球,并摧毁它们所撞击的任何东西。她为自己的安全感到焦虑,发誓要找到一个安全的地方(一个永远不会被流星摧毁的地方)。如果将牧场放入一个直角坐标系中,贝茜现在的位置是原......
  • 洛谷 P1162 填涂颜色 C语言 bfs
    题目:https://www.luogu.com.cn/problem/P1162由数字 0 组成的方阵中,有一任意形状的由数字 1 构成的闭合圈。现要求把闭合圈内的所有空间都填写成 22。例如:6×6的方阵(n=6),涂色前和涂色后的方阵如下:如果从某个 0 出发,只向上下左右 4 个方向移动且仅经过其他 00 的情......
  • 洛谷 P1332 血色先锋队 C语言 bfs
    题目:https://www.luogu.com.cn/problem/P1332#submit题目背景巫妖王的天灾军团终于卷土重来,血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团,以及一切沾有亡灵气息的生物。孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重包围,现在他们将主力只好聚集了起来,以......
  • 洛谷 【LGR-206-Div.3】洛谷基础赛 #17 & Diligent-OI Round 1 的 第二题 P11272「Dil
    1.首先,这道题涉及到了区间和和区间积,所以需要用到前缀和s[N]。2.然后,题目解释需要分类讨论!!!下文中的n为n=r-l+1;!!!并非题干中的n;当k >= n时,区间积+k>=k,即使区间全部为1,区间和也是n。(但是如果全为1 区间积+k就为k+1 不合题意),所以种情况为无解,输......