题目来源
题目描述
题目解析
- 这道题和leetcode:79.二维矩阵可以走出的单词几乎一模一样,只是79题目只要求能不能走出来,而本题要求输出每个单元的下标
- 我们可以遍历二维矩阵,枚举每一个点作为起点,然后看能否走完
- 怎么知道有没有走完?通过str[k]来控制
- 不能走回头路,通过标记二维数组data[i] = 0。同时记得四个方向都走完了时,要恢复现场
#include <iostream>
#include <utility>
#include <vector>
#include <random>
#include <iterator>
#include <map>
#include <algorithm>
#include <set>
#include <bitset>
#include <queue>
#include <iostream>
using namespace std;
class Solution{
bool noLoop(std::vector<std::vector<char>> &m, int i, int j, std::string str, int k, std::vector<int> &idxVec){
//已经走完了
if(k == str.size()){
return true;
}
//还有字符需要走
//越界或者m[i][j] != str[k]
if(i == -1 || i == m.size() || j == -1 || j == m[0].size() || m[i][j] != str[k]){
return false;
}
m[i][j] == 0;
idxVec.push_back(i);
idxVec.push_back(j);
bool ans = false;
if(noLoop(m, i - 1, j, str, k + 1, idxVec)
|| noLoop(m, i + 1, j, str, k + 1, idxVec)
|| noLoop(m, i , j - 1, str, k + 1, idxVec)
|| noLoop(m, i, j + 1, str, k + 1, idxVec)){
ans = true;
}
idxVec.pop_back();
idxVec.pop_back();
m[i][j] = str[k];
return ans;
}
public:
// 按字符串的字符顺序输出字符串每个字符所在单元格的位置下标字符串
// 假定在数组中最多只存在一个可能的匹配。
bool process(std::vector<std::vector<char>> &m, std::string str){
std::vector<int> ans;
bool success = false;
for (int i = 0; i < m.size(); ++i) {
for (int j = 0; j < m[0].size(); ++j) {
if(str[0] == m[i][j]){
ans.clear();
if(noLoop(m, i, j, str, 0, ans)){
success = true;
}
}
}
}
if(success){
std::string ansStr;
for(int i = 0; i < ans.size(); i++){
ansStr = ansStr.empty() ? to_string(ans[i]) : ansStr + "," + to_string(ans[i]);
}
std::cout << ansStr << "\n";
}else{
std::cout << "N" << "\n";
}
}
};