题目:
分析:
第一想法:
只想到了直接遍历,没有想到如何优化。
题解:
没有优化,就是最基本的不匹配后的剪枝
我的c++代码:超时,但好像没错吧!
class Solution {
public:
bool f(string w,int t,int x,int y,vector<vector<char> > b,vector<vector<char> > b2)
{//t表示的是字符串的下标
//结束
if(t==w.size()) return 1;
//非法下标
if(x<0||x>=b.size()||y<0||y>=b[0].size()) return 0;
cout<<b[x][y]<<" "<<w[t]<<endl;
if(b[x][y]!=w[t]) return 0;
//之前判断
//if(A[x][y]==t) return 0;
//被用过
if(b2[x][y]) return 0;
b2[x][y]=1;
if(f(w,t+1,x+1,y,b,b2)) return 1;
if(f(w,t+1,x-1,y,b,b2)) return 1;
if(f(w,t+1,x,y+1,b,b2)) return 1;
if(f(w,t+1,x,y-1,b,b2)) return 1;
return false;
}
bool exist(vector<vector<char>>& b, string w) {
vector<vector<char> > b2=b;
for(int i=0;i<b.size();i++)
for(int j=0;j<b[0].size();j++) b2[i][j]=0;
int ok=0;
for(int i=0;i<b.size();i++)
for(int j=0;j<b[0].size();j++)
{
cout<<"---"<<endl;
if(f(w,0,i,j,b,b2))
{
ok=1;
break;
}
}
if(ok==1) return 1;
return 0;
}
};
学习python:
def dfs(i, j, k):
if not 0 <= i < len(board) or not 0 <= j < len(board[0]) or board[i][j] != word[k]: return False
if k == len(word) - 1: return True
tmp, board[i][j] = board[i][j], '/'
res = dfs(i + 1, j, k + 1) or dfs(i - 1, j, k + 1) or dfs(i, j + 1, k + 1) or dfs(i, j - 1, k + 1)
board[i][j] = tmp
return res
for i in range(len(board)):
for j in range(len(board[0])):
if dfs(i, j, 0): return True
return False
学习点:
1.再强调函数内可以再套函数。
2.可以有x<y<z的形式。