Maze

今天看到这道搜索题,发现很久没写bfs都不熟练了。。。

由于要求字母不能重复用,因此还是和普通BFS DFS一样,visit数组来判断是否访问,只在匹配到了字符串才置对应位为1,

BFS里面由于增加了匹配,因此如果未匹配应该是取下一个queue的内容,continue到下一轮循环,之前把pop写到后面去了,导致死循环,front() 和pop()以后要紧跟,因为后面可能加些访问
之类的东西,例如这里加了一个如果当前不match就return,导致只peek却没有pop。

dfs也是一样,忘记了不match直接return,以为不加也是一样,其实如果不加的话,可能当前不匹配但是后面扩展又匹配导致出错甚至死循环,由于dfs是递归算法,因此只能设置标志位
来判断是否match了,因此效率应该是不如bfs的。

#include <cstring>
#include <cstdio>
#include <iostream>
#include <queue>
using namespace std;
int n,m;
char str[100+1];
char mat[22][22];
bool visit[22][22];
int dfs_stri;
bool dfs_found;
bool search_bfs()
{
    int stri;
    pair<int, int> p;
    for(int i=0;i<=n-1;i++)
    {
        for(int j=0;j<=m-1;j++)
        {
            for(int i=0;i<=n-1;i++)
                memset(visit[i],0,sizeof(bool)*m);
            stri=0;
            if(mat[i][j]!=str[stri])
                continue;
            queue<pair<int, int> > q;
            q.push({i,j});
            while(!q.empty())
            {
                p=q.front();
                q.pop();
                if(mat[p.first][p.second]==str[stri])
                    stri++,visit[p.first][p.second]=1;
                else
                    continue;
                if(!str[stri])
                {
                    //cout<<i<<" "<<j<<" "<<p.first<<" "<<p.second<<endl;
                    return true;
                }

                if(p.first-1>=0 && visit[p.first-1][p.second]==false && mat[p.first-1][p.second]==str[stri])
                    q.push({p.first-1,p.second});

                if(p.first+1<=n-1 && visit[p.first+1][p.second]==false && mat[p.first+1][p.second]==str[stri])
                    q.push({p.first+1,p.second});
                if(p.second-1>=0 && visit[p.first][p.second-1]==false && mat[p.first][p.second-1]==str[stri])
                    q.push({p.first,p.second-1});
                if(p.second+1<=m-1 && visit[p.first][p.second+1]==false && mat[p.first][p.second+1]==str[stri])
                    q.push({p.first,p.second+1});   

            }
        }
    }
    return false;
}
void dfs(pair<int, int> p)
{
    if(mat[p.first][p.second]==str[dfs_stri])
        dfs_stri++,visit[p.first][p.second]=1;
    else
        return ;
    if(!str[dfs_stri])
    {
        dfs_found=true;
        return ;
    }
    if(p.first-1>=0 && !visit[p.first-1][p.second] && mat[p.first-1][p.second]==str[dfs_stri])
        dfs({p.first-1,p.second});
    if(p.first+1<= n-1 && !visit[p.first+1][p.second] && mat[p.first+1][p.second]==str[dfs_stri])
        dfs({p.first+1,p.second});
    if(p.second-1>=0 && !visit[p.first][p.second-1] && mat[p.first][p.second-1]==str[dfs_stri])
        dfs({p.first,p.second-1});
    if(p.second+1<= m-1 && !visit[p.first][p.second+1] && mat[p.first][p.second+1]==str[dfs_stri])
        dfs({p.first,p.second+1});
}
bool search_dfs()
{
    for(int i=0;i<=m-1;i++)
    {
        for(int j=0;j<=n-1;j++)
        {
            for(int k=0;k<=n-1;k++)
                memset(visit[k],0,sizeof(visit[k]));
            dfs_stri=0;
            dfs_found=false;
            dfs(make_pair(i,j));
            if(dfs_found)
            {
                cout<<i<<" "<<j<<endl;
                return true;
            }
        }
    }
    return false;
}

/*
bool search()
{
    int si, sj,stri;
    for(int i=0;i<=n-1;i++)
    {
        for(int j=0;j<=m-1;j++)
        {
            si=i,sj=j;
            stri=0;
            while(str[stri])
            {
                if(si-1>=0 && mat[si-1][sj]==str[stri])//up
                    stri++,si--;
                else if(si+1<=n-1 && mat[si+1][sj]==str[stri])//down
                    stri++, si++;   
                else if(sj-1>=0 && mat[si][sj-1]==str[stri])//left
                    stri++,sj--;
                else if(sj+1<=m-1 && mat[si][sj+1]==str[stri])//right
                    stri++,sj++;
                else
                    break;
            }
            //if(str[stri])
            //    return 0;
            if(!str[stri])
            {
                cout<<i<<" "<<j<<endl<<si<<" "<<sj<<endl;
                return true;
            }
        }
    }
    return false;
}*/

int main()
{
    freopen("maze.in","r",stdin);
    scanf("%d%d ",&n,&m);
    //gets(str);
    //cout<<str<<endl;
    for(int i=0;i<n;i++)
        scanf("%s ",mat[i]),cout<<mat[i]<<endl;

    /*
    if(search_bfs())
        puts("YES");
    else
        puts("NO");
    */
    while(gets(str))
    {
        cout<<str<<endl;
        if(search_dfs())
            puts("YES");
        else
            puts("NO");
    }
    return 0;
}

今天在外面看到vogue这个词,查了知道是时尚,时髦的意思,在自行车上很多

Posted by richard爱闹 - 9月 6 2014
如需转载,请注明: 本文来自 Richard