7-8 打死我也不说

这道题很显然就是一道标准的深度优先搜索题,在此之前我们谈谈深度优先搜索,深度优先搜索就是用递归的形式,查看周围是否存在满足条件的关系物,其中最有代表的题型就是小岛问题和迷宫问题,详情请参考

岛屿问题力扣https://leetcode.cn/problems/max-area-of-island/solution/dao-yu-de-zui-da-mian-ji-by-yong-yuan-de-71i5/

 关于这道题类似于小岛问题但方向增多了四个左上下斜,右上下斜,所以我们的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";
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

B程洪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值