寻找丢失的LZY(dfs)

题目描述
自从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;
}


发布了46 篇原创文章 · 获赞 5 · 访问量 2669

猜你喜欢

转载自blog.csdn.net/xuhang513/article/details/104861290
dfs
今日推荐