题目描述
自从LZY被大魔王抓走后,CYB成员们一直想尽方法找到他!
想要知道LZY的下落,只能破解出大魔王的密码。
现在给定一个二维网格和一个单词密码,找到该密码是否存在于网格中!
输入
题目有多组测试样例,第一行输入两个数字n 和 m,代表地图为n行m列,第二行需要查找的单词s,接下来有一个n*m的字符矩阵! (1 <= n, m <= 1000, 1 <= s.length() <= 100)
提示: 测试样例T (1 <= T <= 50)
输出
对于每个测试样例,在一行中输出是否能找到,如果是输出’True’, 否则输出’False’ (不包含单引号)
样例输入 Copy
3 4
ABCCED
ABCE
SFCS
ADEE
3 4
ABCB
ABCE
SFCS
ADEE
样例输出 Copy
True
False
- 题意:找二维网格里有没有密码,不能重复
- 首先循环找s[0] (密码的第一位),有的的话放进去跑dfs
- 需要用到回溯,因为如果密码是ababababa,碰到ab就直接Ture了
#include<bits/stdc++.h>
using namespace std;
int n, m, flag;
string s, a[1005];
int vis[1005][1005];
int dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};
void dfs(int x, int y, int len){
if(len == 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(a[tx][ty] == s[len] && vis[tx][ty] == 0){
vis[tx][ty] = 1;
dfs(tx, ty, len + 1);
vis[tx][ty] = 0;
if(flag)return ;
}
}
return ;
}
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++)
cin >> a[i];
flag = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(a[i][j] == s[0]){
vis[i][j] = 1;
dfs(i, j, 1);
vis[i][j] = 0;
}
if(flag)break;
}
if(flag)break;
}
if(flag)cout << "True" << endl;
else cout << "False" << endl;
}
return 0;
}