关于深搜的基础题目

题意:给出一个roe*col的大写字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动,并且不能移向曾经经过的字母。问最多可以经过几个字母。

。问最多可以经过几个字母。(同时要注意不能转移到曾经过的字母 是指单次的一条路线不能移向曾经经过的字母。)

思路:深搜的经典题目,基础的Dfs

代码:

#include
using namespace std;
const int m=30;
int row,col,n=0;
char map[m][m];//代表一个方格状的地图
bool viste[m];//bool类型的数组其避免重复访问的作用
int dr[4]={-1,0,0,1};
int dc[4]={0,-1,1,0};
bool inmap(int r,int c)//用于判断是否在地图内
{

 if(r>=1&&r<=row&&c>=1&&c<=col)  return true;
 else   return false;
}
void dfs(int dep,int x,int y){

 if(dep>n)  n=dep;//n用于记录dep的返回值
 for(int i=0;i<4;i++)
 {
  int r=x+dr[i];
  int c=y+dc[i];
  if(inmap(r,c)&&!viste[map[r][c]-'A'])//!viste[map[r][c]-'A']代表viste[1]..[2]等数字代表的数组各代表一个访问过的字母,viste[]为false就代表还没被访问过
  {
   viste[map[r][c]-'A']=true;//访问过的做TRUE的标志
   dfs(dep+1,r,c);
   viste[map[r][c]-'A']=false;//将各个已访问过的字母赋空值一边下一次的搜索
   
  }
 }
}
int main()
{
 cin>>row>>col;
 for(int i=1;i<=row;i++)
  for(int j=1;j<=col;j++)
   cin>>map[i][j];
  memset(viste,false,sizeof(viste));//将所有值都制空
  viste[map[1][1]-'A']=true;
  dfs(1,1,1);
  cout<   return 0;




}





你可能感兴趣的:(搜索专题DFS&&BFS)