二维平面中的回溯法;
//二维平面上的回溯法
#include <iostream>
#include <vector>
#include <cassert>
using namespace std;
/*
问题描述:给定一个二维平面的字母和一个单词,判断是否可以通过该二维平面找到该单词。
*/
class Solution{
private:
//向上、右、下、左进行移动(自上开始的顺时针顺序)
int d[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
int m,n;//二维平面的界限
vector<vector<bool>> visited;//存储是否被访问过
bool inArea(int x,int y){
return x>=0 &&x<m &&y<=0 &&y<n;
}
//从board[startx][starty]开始,寻找word[index...word.size()]
bool searchWord(const vector<vector<char>> &board,const string &word,int index,
int startx,int starty ){
if(index==word.size()-1){
return board[startx][starty]==word[index];
}
if(board[startx][starty]==word[index]){
visited[startx][starty]=true;
//从startx,starty位置出发,向四个方向递归寻找
//向四个方向寻找的书写技巧:
for(int i=0;i<4;i++){
//坐标随着预设的数组d,进行上右下左如此顺时针的遍历
int newx=startx+d[i][0];
int newy=starty+d[i][1];
//判断新的坐标是否越界、是否被访问过
if(inArea(newx,newy)&& !visited[newx][newy]){
//递归函数有返回值,if(ture) return true
if(searchWord(board,word,index+1,newx,newy)){
return true;
}
}
//回溯
visited[][]=false;
}
}
return false;
}
public:
bool exist(vector<vector<char>>& board,string word ){
m=board.size();
assert(m>0);//保证二维平面至少有一行
n=board[0].size();
visited=vector<vector<bool>>(n,vector<bool>(n,false));
for(int i=0;i<board.size();i++){
for(int j=0;j<board.size();j++){
if(searchWord(board,word,0,i,j)){
return true;
}
}
}
return false;
}
};
int main(){
return 0;
}