题目描述
自从LZY被大魔王抓走后,CYB成员们一直想尽方法找到他!
想要知道LZY的下落,只能破解出大魔王的密码。
现在给定一个二维网格和一个单词密码,找到该密码是否存在于网格中!
输入
题目有多组测试样例,第一行输入两个数字n 和 m,代表地图为n行m列,第二行需要查找的单词s,接下来有一个n*m的字符矩阵! (1 <= n, m <= 1000, 1 <= s.length() <= 100)
提示: 测试样例T (1 <= T <= 50)
输出
对于每个测试样例,在一行中输出是否能找到,如果是输出’True’, 否则输出’False’ (不包含单引号)
样例输入
3 4
ABCCED
ABCE
SFCS
ADEE
3 4
ABCB
ABCE
SFCS
ADEE
样例输出
True
False
思路
dfs题
因为没说从哪里开始,所以要先找到起始位置
按顺序找到字母,找错回溯 否则可能反复横跳
代码
#include<bits/stdc++.h>
using namespace std;
int m,n;
string s;
int flag;
char mp[1005][1005];
int vis[1005][1005];
int dir[4][2]={ {-1,0},{0,1},{0,-1},{1,0} };
void dfs(int x,int y,int z){
if(z==s.size()){ //终止条件
flag=1;
return;
}
for(int i=0;i<4;i++){
int tx=x+dir[i][0]; //向四个方向走
int ty=y+dir[i][1];
if(tx<0||ty<0||tx>n-1||ty>m-1) continue;//出界
if(mp[tx][ty]==s[z]&&vis[tx][ty]==0){//如果走完后的位置是正确的字符
vis[tx][ty]=1;//标记 //并且没被走过,防止左右反复横条
dfs(tx,ty,z+1);//下一步搜索
vis[tx][ty]=0;//回溯
}
}
}
int main()
{
ios::sync_with_stdio(false);
while(cin>>n>>m){
memset(vis,0,sizeof(vis));
cin>>s;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>mp[i][j];
}
}
flag=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(mp[i][j]==s[0])//要找到起始位置
{
vis[i][j]=1;
dfs(i,j,1);
vis[i][j]=0;
}
}
}
if(flag) cout<<"True"<<endl;
else cout<<"False"<<endl;
}
return 0;
}