1416_深搜判环

Posted 六花的邪王真眼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1416_深搜判环相关的知识,希望对你有一定的参考价值。

深度优先搜索判断是否成环,代码如下,可以有O1优化空间。

 

#include<bits/stdc++.h>
using namespace std;
const long long MAXN=233;
char mapp[MAXN][MAXN];
set<long long> s1;
set<long long> s2;
long long n,m;
void init()
{
    memset(mapp,0,sizeof(mapp));
    cin>>n>>m;
    for(int i=0;i<n;++i)
    {
        for(int j=0;j<m;++j)
        {
            cin>>mapp[i][j];
        }
    }
}
bool dfs(int x,int y,int l1=MAXN,int l2=MAXN)
{
    s1.insert(x*MAXN+y);
    if(s2.count(x*MAXN+y))return true;
    s2.insert(x*MAXN+y);
    char c=mapp[x][y];    
    if((x-1!=l1||y!=l2)&&x>0)
    {
        char a=mapp[x-1][y];
        if(a==c&&dfs(x-1,y,x,y))return true;
    }
        if((x!=l1||y-1!=l2)&&y>0)
    {
        char a=mapp[x][y-1];
        if(a==c&&dfs(x,y-1,x,y))return true;
    }
        if((x+1!=l1||y!=l2))
    {
        char a=mapp[x+1][y];
        if(a==c&&dfs(x+1,y,x,y))return true;
    }    if((x!=l1||y+1!=l2))
    {
        char a=mapp[x][y+1];
        if(a==c&&dfs(x,y+1,x,y))return true;
    }
    return false;
}

void cal()
{
    for(int i=0;i<n;++i)
    {
        for(int j=0;j<m;++j)
        {    
            s2.clear();
            if(!s1.count(i*MAXN+j)&&dfs(i,j))
            {
                cout<<"Yes"<<endl;
                return;
            }
        }
    }
    cout<<"No"<<endl;
}
int main()
{
    cin.sync_with_stdio(false);
    init();
    cal();    
    return 0;
}

 

以上是关于1416_深搜判环的主要内容,如果未能解决你的问题,请参考以下文章

FZU2150 Fire Game BFS搜索

Farm Irrigation_深搜_并查集

[代码小技巧]判环

片段中的Android Snackbar NullPointerException

BZOJ_2393_Cirno的完美算数教室&&BZOJ_1853_[Scoi2010]幸运数字 _深搜+容斥原理

环形链表问题(判环求入口点)