首页 > 代码库 > 51nod 1416 两点 dfs
51nod 1416 两点 dfs
1416 两点
题目来源: CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
收藏
关注
福克斯在玩一款手机解迷游戏,这个游戏叫做”两点”。基础级别的时候是在一个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。
Input示例
3 4AAAAABCAAAAA3 4AAAAABCAAADA
Output示例
YesNo
dfs直接搜,走过的点标记
不回头走 如果搜到已经标记过的点的话证明成环
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <queue>#include <vector>#include <iomanip>#include <math.h>#include <map>using namespace std;#define FIN freopen("input.txt","r",stdin);#define FOUT freopen("output.txt","w",stdout);#define INF 0x3f3f3f3f#define INFLL 0x3f3f3f3f3f3f3f#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1typedef long long LL;typedef pair<int, int> PII;using namespace std;char mp[55][55];int vis[55][55];int flag = 0;int fs[] = {0, -1, 0, 1}; //下左上右int fs2[] = {1, 0, -1, 0};int n, m;void dfs(int x, int y, char c, int dir) { if(x < 0 || x > n-1 || y < 0 || y > m-1 || mp[x][y] != c) return; if(vis[x][y]) { flag = 1; //cout << x<<" "<< y << " "<<dir <<endl; } if(flag) return; vis[x][y] = 1; for(int i = 0; i < 4; i++) { if(dir == 0 && i == 2) continue; if(dir == 1 && i == 3) continue; if(dir == 2 && i == 0) continue; if(dir == 3 && i == 1) continue; int xx = x + fs[i]; int yy = y + fs2[i]; dfs(xx, yy, c, i); }}int main() { //FIN while(~scanf("%d%d", &n, &m)) { for(int i = 0; i < n; i++) scanf("%s", mp[i]); flag = 0; memset(vis, 0, sizeof(vis)); for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { if(flag) break; if(vis[i][j]) continue; dfs(i, j, mp[i][j], -1); } if(flag) break; } if(flag) printf("YES\n"); else printf("NO\n"); } return 0;}
51nod 1416 两点 dfs
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。