Word Maze(单词迷宫)

#include <iostream>
#include <string>
#include <stack>
using namespace std;
int m,n,len;
bool **visited;
string word ,*MyMap;
struct  MyPoint
{
    int row;
    int col;
};

bool fun(int cur ,MyPoint p)
{
    if (len == cur) //当先cur 等于单词的长度,则找到了。否则在点p的上下左右找单词中对应的下一个点并加到栈 sMP 中
    {
        return true;
    }
    stack<MyPoint> sMP;
    if (p.col-1>=0 && (!visited[p.row][p.col-1]) && word[cur] ==MyMap[p.row][p.col-1])
    {
        MyPoint mp;
        mp.row = p.row;
        mp.col = p.col-1;
        sMP.push(mp);
    }

    if (p.col+1<m && (!visited[p.row][p.col+1])&& word[cur] ==MyMap[p.row][p.col+1])
    {
        MyPoint mp;
        mp.row = p.row;
        mp.col = p.col+1;
        sMP.push(mp);
    }

    if (p.row-1>=0 && (!visited[p.row-1][p.col])&& word[cur] ==MyMap[p.row-1][p.col])
    {
        MyPoint mp;
        mp.row = p.row-1;
        mp.col = p.col;
        sMP.push(mp);
    }

    if (p.row+1<n && (!visited[p.row+1][p.col])&& word[cur] ==MyMap[p.row+1][p.col])
    {
        MyPoint mp;
        mp.row = p.row+1;
        mp.col = p.col;
        sMP.push(mp);
    }


    while(!sMP.empty()) //栈不为空的话就继续找
    {
        MyPoint mp = sMP.top();
        visited[mp.row][mp.col]=true; // 将字母设置为访问过
        if(!fun(cur+1,mp)) //判断以点mp对应的字母继续往下查找 是否能找到下一个对应的字母
        {
            visited[mp.row][mp.col]=false; //如果找不到 将mp 对应的字母设置为没有访问
            sMP.pop();// 将mp弹出栈

        }else
        {
            return true;// 找到的话返回true

        }
    }
    return false; //栈为空 还没找到的话 返回false
}
int main()
{

    while(cin>>m>>n)
    {
        visited = new bool*[n];
        for (int i=0;i<n;i++)
        {
            visited[i] = new bool[m];
        }

        for (int i=0;i<n;i++)
        {
            for(int j=0; j<m; j++)
            {
                visited[i][j]=false;
            }
        }


        cin>>word; // 单词
        len = word.length();
        MyMap = new string[n]; //字母表
        for(int i=0;i<n;i++)
        {
            cin>>MyMap[i];
        }


        stack<MyPoint> sMP;
        for (int i=0; i<n; i++) //将单词的第一个字母相同的字母表对应的点加到栈里
        {
            for (int j=0; j<m; j++)
            {
                if (word[0] == MyMap[i][j])
                {
                    MyPoint mp;
                    mp.row = i;
                    mp.col = j;
                    sMP.push(mp);

                }
            }
        }

        while(!sMP.empty())
        {
            MyPoint mp = sMP.top();
            visited[mp.row][mp.col]=true;
            if(!fun(0+1,mp))
            {
                visited[mp.row][mp.col]=false;
                sMP.pop();

            }else
            {
                cout<<"YES"<<endl;
                getchar();
                return 0;

            }
        }

        cout<<"NO"<<endl;
        getchar();
        return 0;

    }
}

5 5

SOLQ

CSUCY
EOQLH
COSOL
EKLQQ
PGRBC

按照单词顺序 在字母迷宫里找对应的单词,每个字母只能走一次

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值