这道题很显然就是一道标准的深度优先搜索题,在此之前我们谈谈深度优先搜索,深度优先搜索就是用递归的形式,查看周围是否存在满足条件的关系物,其中最有代表的题型就是小岛问题和迷宫问题,详情请参考
关于这道题类似于小岛问题但方向增多了四个左上下斜,右上下斜,所以我们的dfs中就得弄八个递归关系,似乎有点多,我们在此处会做一优化,我们会引入一个偏移数组,用来进行递归关系转化。具体代码如下,
int tx,ty;
int dx[8]={0,0,1,-1,1,1,-1,-1};
int dy[8]={1,-1,0,0,1,-1,1,-1};
for(int i=0; i<8; i++)
{
tx=x+dx[i];
ty=y+dy[i];
if(tx>=0&&ty>=0&&tx<mop.size()&&ty<mop[0].size()&&mop[tx][ty]==finds[t+1])
{
dfs(mop,tx,ty,t+1);
}
}
看上述代码中我们会将当前点中的字母与主字符串中的字母依次比较,最后如果dfs中的那个t值等于6时,说明整个二维矩阵中有我们的需要的密码。
我们会定义几个全局变量储存我们需要的值。、
int dx,dy,sx,sy;//分别为D的坐标和最后一个S的坐标
char finds[8]="0DSWYBS";//比较字符串
int time1=0;//判断成功的标志
之后就是一些简单操作了本题代码如下。
#include<bits/stdc++.h>
using namespace std;
int dx,dy,sx,sy;
char finds[8]="0DSWYBS";
int time1=0;
void dfs(vector<vector<char> >&mop,int x,int y,int t)
{
if(t==6&&mop[x][y]==finds[t])
{
sx=x;sy=y;
time1=1;
return ;
}
int tx,ty;
int dx[8]={0,0,1,-1,1,1,-1,-1};
int dy[8]={1,-1,0,0,1,-1,1,-1};
for(int i=0; i<8; i++)
{
tx=x+dx[i];
ty=y+dy[i];
if(tx>=0&&ty>=0&&tx<mop.size()&&ty<mop[0].size()&&mop[tx][ty]==finds[t+1])
{
dfs(mop,tx,ty,t+1);
}
}
}
int main()
{
int x,y;cin>>x>>y;
vector<vector<char> >mop(x,vector<char>(y));
for(int i=0;i<x;i++)
{
for(int i1=0;i1<y;i1++)
{
cin>>mop[i][i1];
}
}
for(int i=0;i<x;i++)
{
for(int i1=0;i1<y;i1++)
{
if(mop[i][i1]=='D')
{
dfs(mop,i,i1,1);
dx=i;dy=i1;
if(time1==1)
{
cout<<dx<<" "<<dy<<endl;
cout<<sx<<" "<<sy<<endl;
cout<<dx+dy+sx+sy<<endl;
return 0;
}
}
}
}
cout<<"DSWYBS";
}