单词搜索
1.问题描述
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
[‘A’,‘B’,‘C’,‘E’],
[‘S’,‘F’,‘C’,‘S’],
[‘A’,‘D’,‘E’,‘E’]
]
给定 word = “ABCCED”, 返回 true
给定 word = “SEE”, 返回 true
给定 word = “ABCB”, 返回 false
可使用以下main函数:
int main()
{
vector<vector<char> > board;
string word;
int m,n;
cin>>m;
cin>>n;
char ch;
for(int i=0; i<m; i++)
{
vector<char> aLine;
for(int j=0; j<n; j++)
{
cin>>ch;
aLine.push_back(ch);
}
board.push_back(aLine);
}
cin>>word;
bool res=Solution().exist(board,word);
cout<<(res?"true":"false")<<endl;
return 0;
}
2.输入说明
首先输入board的行数m、列数n,
然后输入m行,每行n个大写或小写英文字母。
最后输入一个单词word,长度在1到100之间,只包含大写和小写英文字母。
1 <= m <= 80
1 <= n <= 80
3.输出说明
输出true或false
4.范例
输入
3 4
ABCE
SFCS
ADEE
ABCCED
输出
true
5.代码
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
//回溯
//board为给定的字符矩阵,map记录当前字符是否访问过,word用来表示目标字符串,index表示当前访问的word下标
bool backtrack(vector<vector<char>>& board, vector<vector<int>>& map, string word, int i, int j, int index) {
//判断下标是否正常,是否已经遍历过,对应的字符是否匹配
if (i < 0 || i == board.size() || j < 0 || j == board[0].size() || map[i][j] || board[i][j] != word[index]) return false;
//遍历到字符串word结尾,并且对应的字符依然匹配
if (index == word.size() - 1 && word[index] == board[i][j]) return true;
map[i][j] = 1;//标记该位置已经访问过
//进行上下左右四个方位相邻点的访问
if (backtrack(board, map, word, i, j - 1, index + 1) ||
backtrack(board, map, word, i - 1, j, index + 1) ||
backtrack(board, map, word, i, j + 1, index + 1) ||
backtrack(board, map, word, i + 1, j, index + 1))
return true;
//回溯到上一种情况
map[i][j] = 0;
return false;
}
bool exist(vector<vector<char> > &board, string word)
{
int row = board.size();//行数
int column = board[0].size();//列数
//注意二维数组的初始化方法
vector<vector<int> >map(row, vector<int>(column,0));//定义访问map初始值均为0
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++)
{
if (backtrack(board, map, word, i, j, 0))
return true;
}
}
return false;
}
int main()
{
vector<vector<char> > board;
string word;
int m, n;
cin >> m;
cin >> n;
char ch;
for (int i = 0; i < m; i++)
{
vector<char> aLine;
for (int j = 0; j < n; j++)
{
cin >> ch;
aLine.push_back(ch);
}
board.push_back(aLine);
}
cin >> word;
bool res = exist(board, word);
cout << (res ? "true" : "false") << endl;
return 0;
}
6.新知识点
vector<vector<int> >map(row, vector<int>(column,0));//定义访问map初始值均为0
//其中row表示行数,column表示列数