#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
按照单词顺序 在字母迷宫里找对应的单词,每个字母只能走一次