两点(DFS)
福克斯在玩一款手机解迷游戏,这个游戏叫做”两点”。基础级别的时候是在一个n×m单元上玩的。像这样:
每一个单元有包含一个有色点。我们将用不同的大写字母来表示不同的颜色。
这个游戏的关键是要找出一个包含同一颜色的环。看上图中4个蓝点,形成了一个环。一般的,我们将一个序列 d1,d2,...,dk 看成一个环,当且仅当它符合下列条件时:
1. 这k个点不一样,即当 i≠j时, di 和 dj不同。
2. k至少是4。
3. 所有的点是同一种颜色。
4. 对于所有的 1≤i≤k-1: di 和 di+1 是相邻的。还有 dk 和 d1 也应该相邻。单元 x 和单元 y 是相邻的当且仅当他们有公共边。
当给出一幅格点时,请确定里面是否有环。
Input单组测试数据。
第一行包含两个整数n和m (2≤n,m≤50):板子的行和列。
接下来n行,每行包含一个有m个字母的串,表示当前行每一个点的颜色。每一个字母都是大写字母。Output如果有环输出Yes,否则输出No。Sample Input
3 4
AAAA
ABCA
AAAA
3 4
AAAA
ABCA
AADA
Sample Output
Yes
No
分析:使用dfs遍历二维数组,每个点只走一次,如果一个点即将走的下一个点的另外三个点是之前走过的点且颜色相同说明包含环
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = ;
char mp[N][N];
int dx[] = {, -, , };
int dy[] = {, , , -};
int vis[N][N];
int n, m;
int check(int x, int y) {
return x >= && x < n && y >= && y < m;
}
int dfs(int x, int y) {
int flag = ;
vis[x][y] = ;
for(int i = ; i < ; i++) {
int nx = x + dx[i], ny = y + dy[i];
if(check(nx, ny) && mp[nx][ny] == mp[x][y] && !vis[nx][ny]) {
for(int j = ; j < ; j++) {
int mx = nx + dx[j], my = ny + dy[j];
if(mx == x && my == y) continue;
if(check(mx, my) && mp[mx][my] == mp[x][y] && vis[mx][my]) return ;
}
flag += dfs(nx, ny);
}
}
return flag;
}
int main() {
while(scanf("%d%d", &n, &m) == ) {
for(int i = ; i < N; i++)
for(int j = ; j < N; j++) vis[i][j] = ;
for(int i = ; i < n; i++) scanf("%s", mp[i]);
int flag = ;
for(int i = ; i < n; i++) {
for(int j = ; j < m; j++) {
if(!vis[i][j] && dfs(i, j)) {
flag = ;
break;
}
}
if(flag) break;
}
if(flag) printf("Yes\n");
else printf("No\n");
}
return ;
}
两点(DFS)的更多相关文章
- POJ-3204-Ikki's Story I - Road Reconstruction(最大流)
题意: 给一个有向图 求给那些边增加容量能增加总的流量,求边的条数 分析: 一开始求的是割边,结果wa了,那是因为有些割边增加了容量,但总的容量也不会增加 只有满流的边并且从源点汇点都有一条可扩展的路 ...
- 蓝桥杯历届试题 危险系数(dfs或者并查集求无向图关于两点的割点个数)
Description 抗日战争时期,冀中平原的地道战曾发挥重要作用. 地道的多个站点间有通道连接,形成了庞大的网络.但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系. 我们来定义一个 ...
- 2018中国大学生程序设计竞赛 - 网络选拔赛 1009 - Tree and Permutation 【dfs+树上两点距离和】
Tree and Permutation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- dfs+记忆化搜索,求任意两点之间的最长路径
C.Coolest Ski Route 题意:n个点,m条边组成的有向图,求任意两点之间的最长路径 dfs记忆化搜索 #include<iostream> #include<stri ...
- 使用DFS求任意两点的所有路径
先上代码: public static void findAllPaths(Integer nodeId,Integer targetNodeId, Map<Integer,ArrayList& ...
- BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]
3083: 遥远的国度 Time Limit: 10 Sec Memory Limit: 1280 MBSubmit: 3127 Solved: 795[Submit][Status][Discu ...
- DFS序+线段树 hihoCoder 1381 Little Y's Tree(树的连通块的直径和)
题目链接 #1381 : Little Y's Tree 时间限制:24000ms 单点时限:4000ms 内存限制:512MB 描述 小Y有一棵n个节点的树,每条边都有正的边权. 小J有q个询问,每 ...
- dfs判断连通图(无向)
在图论中,连通图基于连通的概念.在一个无向图 G 中,若从顶点vi到顶点vj有路径相连(当然从vj到vi也一定有路径),则称vi和vj是连通的.如果 G 是有向图,那么连接vi和vj的路径中所有的边都 ...
- HDU 2376 树形dp|树上任意两点距离和的平均值
原题:http://acm.hdu.edu.cn/showproblem.php?pid=2376 经典问题,求的是树上任意两点和的平均值. 这里我们不能枚举点,这样n^2的复杂度.我们可以枚举每一条 ...
随机推荐
- arcface和Dlib人脸识别算法对比
我司最近要做和人脸识别相关的产品,原来使用的是其他的在线平台,识别率和识别速度很满意,但是随着量起来的话,成本也是越来越不能接受(目前该功能我们是免费给用户使用的),而且一旦我们的设备掉线了就无法使用 ...
- sort-选择排序
void sort_select(vector<int> &v) { for(int i=0;i<v.size()-1;i++) { int min=v[i]; int in ...
- 关于video.js不错的一篇博客,
博客地址: http://www.cnblogs.com/webenh/p/5815741.html
- (4)进程---daemon守护线程和join阻塞
join ()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),那么,主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行,那么在调用这个线程时可以使用被调用 ...
- 二、idea + git
1.配置git file->setting->git Test 2.配置gitHub 2.1 生成gitHub settings->Developer settings->P ...
- 雷林鹏分享:jQuery EasyUI 窗口 - 窗口与布局
jQuery EasyUI 窗口 - 窗口与布局 Layout 组件可以内嵌在窗口(window)中.我们可以创建一个复杂的布局窗口,甚至不需要写任何的 js 代码.jquery-easyui 框架帮 ...
- LeetCode--283--移动0
问题描述: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序. 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原 ...
- 关于Android如何创建空文件夹,以及mkdir和mkdirs的区别
File().mkdir 和File().mkdirs的区别 mkdir是只能建立一级目录 比如 /sdcard/test/pp 就只能建立test 而mkdirs 则可以全部建立
- android-------- 强引用、软引用、弱引用、虚引用使用
在Java中,虽然不需要程序员手动去管理对象的生命周期,但是如果希望某些对象具备一定的生命周期的话(比如内存不足时JVM就会自动回收某些对象从而避免OutOfMemory的错误)就需要用到软引用和弱引 ...
- js将字符串转json
Json格式字符串 "{"rows":[{"date":"2018-11-19","money":" ...