题目:
分析:
还是强调,回溯数组判断范围条件放开头最简单,亦可以理解为下一轮再判断。
最一般回溯代码–超时:
int f(string s,int i,vector<vector<char> > v,vector<vector<char> > b,int x,int y)
{
//已经到了终点
if(i==s.size()) return 1;
//x y越界
if(x<0||x==v.size()||y<0||y==v[0].size()) return 0;
//已经被使用
if(v[x][y]=='1') return 0;
if(b[x][y]!=s[i]) return 0;
v[x][y]='1';
if(f(s,i+1,v,b,x+1,y)) return 1;
if(f(s,i+1,v,b,x-1,y)) return 1;
if(f(s,i+1,v,b,x,y+1)) return 1;
if(f(s,i+1,v,b,x,y-1)) return 1;
return 0;
}
int main()
{
vector<vector<char> > board;
string word;
vector<vector<char> > v=board;
for(int i=0;i<v.size();i++)
{
for(int j=0;j<v[0].size();j++) v[i][j]='0';
}
for(int i=0;i<v.size();i++)
{
for(int j=0;j<v[0].size();j++)
{
if(f(word,0,v,board,i,j)) return 1;
}
}
return 0;
}
稍作修改的代码:仅仅变为了引用就通过了。
#include<bits/stdc++.h>
using namespace std;
int f(string s,int i,vector<vector<char> > &v,vector<vector<char> > &b,int x,int y)
{
//已经到了终点
if(i==s.size()) return 1;
//x y越界
if(x<0||x==v.size()||y<0||y==v[0].size()) return 0;
//已经被使用
if(v[x][y]=='1') return 0;
if(b[x][y]!=s[i]) return 0;
v[x][y]='1';
if(f(s,i+1,v,b,x+1,y)) return 1;
if(f(s,i+1,v,b,x-1,y)) return 1;
if(f(s,i+1,v,b,x,y+1)) return 1;
if(f(s,i+1,v,b,x,y-1)) return 1;
v[x][y]='0';
return 0;
}
int main()
{
vector<vector<char> > board;
string word;
vector<vector<char> > v=board;
for(int i=0;i<v.size();i++)
{
for(int j=0;j<v[0].size();j++) v[i][j]='0';
}
for(int i=0;i<v.size();i++)
{
for(int j=0;j<v[0].size();j++)
{
if(f(word,0,v,board,i,j)) return 1;
}
}
return 0;
}