2025 : 简单环路

时间限制:1 Sec 内存限制:128 MiB
提交:145 答案正确:41

提交 状态 编辑 讨论区

题目描述

有一个N x M 大小的地图,地图中的每个单元包含一个大写字母。
若两个相邻的(这里的相邻指“上下左右”相邻)点上的字母相同,我们可以用线段连接这两个点。
若存在一个包含同一字母的环路,那么连接这些点我们可以得到一个多边形,
当且仅当多边形的边数大于等于4时,我们称这幅地图中存在“简单环路”。
现在给你一份地图,你来判断是否存在“简单环路”。
列如:
3 4
AAAA
ABCA
AAAA
字符“A”可以构成一个“简单环路”,其边数为4。

输入

第一行输入两个正整数n,m,2<=n,m<=50,分别表示地图的行列数。
接下来输入n行,每行m个大写字母。

输出

若存在“简单环路”输出“Yes”,否则输出“No”。

样例输入

复制
3 4
AAAA
ABCA
AADA

样例输出

复制
No

大致思路:

  1、深度搜索这个图,不需要回头即可,一直沿着上下左右可以走的方向走下去,用order来标记一下搜索的先后次序,每次搜索一个节点更新dp里的值为order的值,并把当前节点置为‘#’,所有判断回路的时候判断 abs(dp[x][y]-dp[xx][yy])>=3,即可。

  2.我的另一篇博客里,用的是tarjan算法判环的。本篇的搜索,用广搜也是同一个道理。时间复杂度O(n*m)。

  3.提供几个参考数据:

 3 4
AAAA
ABCA
AAAA
3 4
AAAA
ABCA
AADA
3 4
AABB
ABBB
AAAA
3 4
AABB
BBBA
AAAA

简单题解:

  解封此debug();函数的注释,可以看到搜索内容。其余有注释。

  

 #include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include<math.h>
#include <string.h>
#include<deque>
using namespace std;
#define inf 0x3f3f3f3f
const double pi=acos(-1.0);
#define ll long long
using namespace std;
#define inf 0x3f3f3f3f
#define N 55 char str[N][N];
int flag,n,m;
int b[][]= {{-,},{,},{,-},{,}};
int dp[N][N];//存贮每个点遍历时的次序 void dfs(int x,int y,int sum,char ch,int order){
if(flag==)
return ;
dp[x][y]=order;
str[x][y]='#'; for(int i=; i<; i++){
int xx=x+b[i][];
int yy=y+b[i][];
if(xx>=n||yy>=m||xx<||yy<)//单向深度搜索,只搜索相同的字符
continue;
if(str[xx][yy]=='#'&&dp[xx][yy]!=-){//遇见本次搜索中相同的字符
if(abs(dp[x][y]-dp[xx][yy])>=){//之前搜索过的字符,判断两者之间的次序差即可
flag=;
return ;
}
}
if(str[xx][yy]!=ch)//可能遇见dp[xx][yy]==-1的情况,需要过滤掉
continue;
dfs(xx,yy,sum,ch,order+);
}
}
void debug(){
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
printf("*%d ",dp[i-][j-]);
}
cout<<endl;
}
printf("flag=%d\n",flag);
}
int main()
{
while(cin>>n>>m){
flag=;
for(int i=; i<n; i++)
scanf("%s",str[i]);
for(int i=; i<n; i++){
for(int j=; j<m; j++){
if(flag==)
break;
if(str[i][j]!='#'){
memset(dp,-,sizeof(dp));
dfs(i,j,,str[i][j],);
// debug();//解封此注释,可以看到搜索内容
}
}
} if(flag)
printf("Yes\n");
else
printf("No\n"); }
return ;
}

【简易DFS/BFS+标记搜索次序的数组】zznu-2025 : 简单环路的更多相关文章

  1. DFS+BFS(广度优先搜索弥补深度优先搜索遍历漏洞求合格条件总数)--09--DFS+BFS--蓝桥杯剪邮票

    题目描述 如下图, 有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连)  比如,下面两张图中,粉红色所示部分就是合格的剪取.  请你计算,一共有多少 ...

  2. 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)

    深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...

  3. 深度优先搜索DFS和广度优先搜索BFS简单解析

    转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...

  4. 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)

    [题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因 ...

  5. DFS&&BFS

    DFS DFS搜索是按照深度的方向搜索,它类似于树的先根遍历,是树的先根遍历的推广. 1.从图的某个顶点v0出发,首先访问v0, 2.找出刚访问过的顶点的第一个未被访问过的邻接点,然后访问该结点,以该 ...

  6. 图的数据结构的实现与遍历(DFS,BFS)

    //图的存储结构:const int MAXSIZE = 10;//邻接矩阵template<class T>class MGraph {public:    MGraph(T a[], ...

  7. 【427】Graph 实现 以及 DFS & BFS

    目录: Graph 实现 二维数组实现 Linked List 实现 DFS:深度优先搜索 stack 实现 recursion 实现 BFS:广度优先搜索(queue) 其他应用 非连通图遍历 - ...

  8. POJ 3083 -- Children of the Candy Corn(DFS+BFS)TLE

    POJ 3083 -- Children of the Candy Corn(DFS+BFS) 题意: 给定一个迷宫,S是起点,E是终点,#是墙不可走,.可以走 1)先输出左转优先时,从S到E的步数 ...

  9. POJ2308连连看dfs+bfs+优化

    DFS+BFS+MAP+剪枝 题意:       就是给你一个10*10的连连看状态,然后问你最后能不能全部消没? 思路:      首先要明确这是一个搜索题目,还有就是关键的一点就是连连看这个游戏是 ...

随机推荐

  1. Blender模型导入进Unity,旋转缩放的调整

    Blender跟Unity的XYZ轴不同的原因,导致Blender模型导入Unity之后会发生模型朝向不对. 请先看看下边这个情况: 首先,Blender物体模式下,对模型进行 旋转 缩放,将会在右边 ...

  2. blender-编译源码

    1. 获得源码,目前是以 2.8 版本为例子 https://www.blender.org/download/  上,可以直接下面源码 2.  解压,在blender-2.80 目录下,运行 mak ...

  3. 解决jdk卸载出错2502、2503

    之前装的jdk1.6,后来软件要求用1.8,就卸载了1.6,卸载的时候出现了这个问题.后来又有其他软件用1.8出错,就又要装1.6,脑壳疼.网上建议先卸载1.8再装低版本,结果卸载1.8,又出现错误2 ...

  4. 安卓计数器类APP推荐

    1. Thing Counter - Google Play 上的应用 可添加多个计数器,同一页面展示,一行一个,操作直观方便: 可以更改计数器颜色,使页面更美观. 每个计数器有详情和历史记录 详情: ...

  5. 动态规划算法(Dynamic Programming,简称 DP)

    动态规划算法(Dynamic Programming,简称 DP) 浅谈动态规划 动态规划算法(Dynamic Programming,简称 DP)似乎是一种很高深莫测的算法,你会在一些面试或算法书籍 ...

  6. 数据结构 -- 哈希表(hash table)

    简介   哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函 ...

  7. 把cgrep mgrep集成到bashrc

    https://android.googlesource.com/platform/build/+/android-4.4.3_r1/envsetup.sh 在~/.bashrc里面增加: #Andr ...

  8. 使用element-ui中的el-upload组件时携带其他参数

    解决方法:// template <el-upload action="/api/oss/file/add" :headers="headers" // ...

  9. JS做2048

    首先我们了解一下2048这个游戏的原理: 他由一个4x4二维数组组成,在游戏一开始时候在随机位置随机生成一个2或者4 如: 1.每点击一次开始就刷新一次游戏界面: 2.通过键盘的上下左右四个方向键分别 ...

  10. vulnhub攻略

    https://www.vulnhub.com/entry/21ltr-scene-1,3/ 这个靶机国内https://www.cnblogs.com/hack404/p/11423228.html ...