https://leetcode.com/problems/word-search/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <stack>
#include <vector>
using namespace std;
const int SIZE = 129;
class Solution {
public:
bool exist(vector<vector<char> >& board, string word) {
int bhash[SIZE] = {0};
int whash[SIZE] = {0};
for(int i=0;i<board.size();i++) {
for( int j=0; j<board[i].size(); j++ ) {
bhash[ board[i][j] ] ++;
}
}
for( int i=0; i<word.size(); i++ ) {
whash[ word[i] ] ++;
}
for(int i=0;i<SIZE;i++) {
if(whash[i] > bhash[i])return false;
}
int flag = 0;
if(board.size() == 0) return false;
int mat[SIZE][SIZE];
for(int i=0; i<board.size(); i++) {
for(int j=0; j<board[i].size(); j++) {
memset(mat, 0, sizeof(mat));
flag = dfs(i, j, board, word, mat);
if( flag ) return true;
}
}
return false;
}
bool dfs(int h, int lie, vector< vector<char> > &board, string wd, int mat[SIZE][SIZE]) {
bool ret = false;
if(wd[0] != board[h][lie] || mat[h][lie] )return false;
mat[h][lie] = 1;
if(wd.size() == 1 ) return true;
ret= ( h-1>=0 && dfs(h-1, lie, board, wd.substr(1), mat) ) ||
( h+1 < board.size() && dfs(h+1, lie, board, wd.substr(1), mat) ) ||
( lie-1>=0 && dfs(h, lie-1, board, wd.substr(1), mat) ) ||
( lie+1<board[0].size() && dfs(h, lie+1, board, wd.substr(1), mat) );
mat[h][lie] = 0; //忘记写了 WA了,,
return ret;
//up down left right
}
};
int main() {
freopen( "79.txt", "r", stdin );
string word;
int n;
while( cin >> n ) {
vector < vector<char> > board;
for(int i=0;i<n;i++) {
cin >> word;
vector <char> tmp;
for( int j=0;j<word.size(); j++ ) {
tmp.push_back(word[j]);
}
board.push_back(tmp);
}
cin >> word;
Solution s;
cout << s.exist(board, word);
}
return 0;
}