[SDUT](3469)深度优先搜索练习之神奇的矩环 ---DFS(图)

2023-10-10 19:20

本文主要是介绍[SDUT](3469)深度优先搜索练习之神奇的矩环 ---DFS(图),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

深度优先搜索练习之神奇的矩环

Time Limit: 1000MS  Memory Limit: 65536KB
Submit  Statistic  Discuss
Problem Description
小鑫的女朋友被魔王抢走了!
魔王留给小鑫一张n*m大的表,上面有各种各样的颜色,用A-Z这26个字母来表示。魔王留给他一个任务,如果小鑫可以在这张表中找出任意一个长度大于1的环,并且这个环的颜色是相同的,魔王就把小鑫的女朋友还给他。为了从魔王手中夺回他的女朋友,小鑫请你帮忙,你能帮帮他吗?
Input
多组输入。
每组的第一行有两个整数n,m。代表表的大小。
接下来是由A-Z的一些字母所构成的n行m列的表。
1<=n,m<=200
Output
如果可以救回他的女朋友,输出Yes,否则输出No
Example Input
4 7
ABCBBAA
BCBCBCB
AABBCCA
ACCCBBB
10 3
AAC
ABB
BBA
AAC
CBC
CCA
CBB
CCA
CCB
BAA
Example Output
No
Yes
学习新知:
      ①:这道题可以用暴力穷举搜索出来,复杂度O(NxM)。应该是这道题数据比较水23333
      ②:学习了一些前辈的DFS写法,感觉很棒,是个很不错的思路。
      ③:关于两种算法, 都要注意一点,就是图的边界要优化!不要越界,否则一定WA。


AC代码:
-----------------------暴力穷举-----------------------
#include<iostream>
#include<cstring>
using namespace std;
int main()
{int n,m;char mmap[205][205];while(cin>>n>>m){int k;int flag=0;int i;int j;for(i=0;i<n;i++)cin>>mmap[i];for(i=0;i<n-1;i++) //i<n-1 防止越界{for(j=0;j<m-1;j++) //j<m-1 防止越界{if(mmap[i][j]==mmap[i][j+1]){if(mmap[i][j]==mmap[i+1][j]){if(mmap[i][j]==mmap[i+1][j+1]){flag=1;break;}}}}if(flag)//剪枝优化break;}if(flag)cout<<"Yes"<<endl;elsecout<<"No"<<endl;}return 0;
}

-----------------------DFS-----------------------
#include<iostream>
#include<cstring>
using namespace std;
char mmap[205][205];
int vis[205][205];
int n,m;
int flag;
void dfs(int x,int y,int px,int py)
{vis[x][y]=1;if(flag)return;if(x-1>=0 && mmap[x-1][y]==mmap[x][y]){if(vis[x-1][y] && ((x-1!=px)||(y!=py)))flag=1;else if(!vis[x-1][y])dfs(x-1,y,x,y);}if(x+1<n && mmap[x+1][y]==mmap[x][y]){if(vis[x+1][y] && ((x+1!=px) || (y!=py)))flag=1;else if(!vis[x+1][y])dfs(x+1,y,x,y);}if(y-1>=0 && mmap[x][y-1]==mmap[x][y]){if(vis[x][y-1] && ((x!=px)||(y-1!=py)))flag=1;else if(!vis[x][y-1])dfs(x,y-1,x,y);}if(y+1<m && mmap[x][y+1]==mmap[x][y]){if(vis[x][y+1] && ((x!=px)||(y+1!=py)))flag=1;else if(!vis[x][y+1])dfs(x,y+1,x,y);}
}
int main()
{while(cin>>n>>m){int i,j;flag=0;memset(mmap,0,sizeof(mmap));memset(vis,0,sizeof(vis));for(i=0;i<n;i++)cin>>mmap[i];for(i=0;i<n;i++){for(j=0;j<m;j++){if(!vis[i][j])dfs(i,j,i,j);if(flag)//剪枝优化break;}if(flag)//剪枝优化break;}if(flag)cout<<"Yes"<<endl;elsecout<<"No"<<endl;}return 0;
}

dfs这种算法的理解:我画了两张图
                             
      其实这个算法就是从源点出发,搜索它的四个方向即上,下,左,右。若能找到与其颜色相同的点,那么他们之间就连通。然后在DFS,直到找到第四个顶点时,若能形成环,那么第四个顶点一定和源点之间有“”,这时候另标记变量flag=1,返回。我算了一下,有八种形成环的走法,每个环有四个点,那么这四个点都可以当做源点,即最终和第四个顶点连通的一定是源点。那么就是4种走法。顺时针4种,逆时针4种,即8种。
----------------------------------------------------------------------------------------------------------------

转载于:https://www.cnblogs.com/WangMeow/p/7535988.html

这篇关于[SDUT](3469)深度优先搜索练习之神奇的矩环 ---DFS(图)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/182544

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

hdu 2489 (dfs枚举 + prim)

题意: 对于一棵顶点和边都有权值的树,使用下面的等式来计算Ratio 给定一个n 个顶点的完全图及它所有顶点和边的权值,找到一个该图含有m 个顶点的子图,并且让这个子图的Ratio 值在所有m 个顶点的树中最小。 解析: 因为数据量不大,先用dfs枚举搭配出m个子节点,算出点和,然后套个prim算出边和,每次比较大小即可。 dfs没有写好,A的老泪纵横。 错在把index在d

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 3050 dfs + set的妙用

题意: 给一个5x5的矩阵,求由多少个由连续6个元素组成的不一样的字符的个数。 解析: dfs + set去重搞定。 代码: #include <iostream>#include <cstdio>#include <set>#include <cstdlib>#include <algorithm>#include <cstring>#include <cm

poj 2431 poj 3253 优先队列的运用

poj 2431: 题意: 一条路起点为0, 终点为l。 卡车初始时在0点,并且有p升油,假设油箱无限大。 给n个加油站,每个加油站距离终点 l 距离为 x[i],可以加的油量为fuel[i]。 问最少加几次油可以到达终点,若不能到达,输出-1。 解析: 《挑战程序设计竞赛》: “在卡车开往终点的途中,只有在加油站才可以加油。但是,如果认为“在到达加油站i时,就获得了一

hdu 4517 floyd+记忆化搜索

题意: 有n(100)个景点,m(1000)条路,时间限制为t(300),起点s,终点e。 访问每个景点需要时间cost_i,每个景点的访问价值为value_i。 点与点之间行走需要花费的时间为g[ i ] [ j ] 。注意点间可能有多条边。 走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。 现在求,从起点出发,到达终点,在时间限制内,能得到的最大

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

韦季李输入法_输入法和鼠标的深度融合

在数字化输入的新纪元,传统键盘输入方式正悄然进化。以往,面对实体键盘,我们常需目光游离于屏幕与键盘之间,以确认指尖下的精准位置。而屏幕键盘虽直观可见,却常因占据屏幕空间,迫使我们在操作与视野间做出妥协,频繁调整布局以兼顾输入与界面浏览。 幸而,韦季李输入法的横空出世,彻底颠覆了这一现状。它不仅对输入界面进行了革命性的重构,更巧妙地将鼠标这一传统外设融入其中,开创了一种前所未有的交互体验。 想象