leetcode:79. 单词搜索(回溯)

题目:

在这里插入图片描述

分析:

还是强调,回溯数组判断范围条件放开头最简单,亦可以理解为下一轮再判断。

最一般回溯代码–超时:

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;
} 
发布了335 篇原创文章 · 获赞 235 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42721412/article/details/105416339