当前位置: 首页 > news >正文

蓝桥杯数字接龙dfs

 

 这是一道dfs模板题

难点:交叉路径判断,字典序最小,找到了就输出,存路径

难点一解决:建立一个二维路径数组用来判断那些路径被访问了。

字典序最小,因为必须从0,0开始遍历所以最开始只有向左或者向右,结合题目只要顺时针遍历方向就可以。

存路径;利用字符串进行存答案方便快捷;

#include <iostream>
#include <string>
using namespace std;
const int N=20;
string ans;
int g[N][N];//图 
bool vis[N][N];//访问标记 
int path[N][N];//记录每个点的移动方向 
        // 0  1 2 3 4 5 6  7
int dx[]={-1,-1,0,1,1,1,0,-1};
        //0 1 2 3 4  5  6  7
int dy[]={0,1,1,1,0,-1,-1,-1};
int n,k;//题目输入 
       //起点      //当前值  //当前组成的字串 
void dfs(int x,int y,int cur,string s,int dep)//搜索点的个数 
{
    if(x==n-1&&y==n-1&&dep==n*n)//搜到了(n-1,n-1),并且搜过了所有的点 
    {
        if(ans.empty()) ans=s;
        return;
    }
    for(int i=0;i<8;i++)//八方向搜索 
    {
        int bx=x+dx[i],by=y+dy[i];
        if(bx<0||bx>n-1||by<0||by>n-1) continue;
        if(vis[bx][by]) continue;
        //判交叉
        if(i==1&&(path[bx][by-1]==3||path[bx+1][by]==7)) continue;
        else if(i==3&&(path[bx-1][by]==5||path[bx][by-1]==1)) continue;
        else if(i==5&&(path[bx-1][by]==3||path[bx][by+1]==7)) continue;
        else if(i==7&&(path[bx+1][by]==1||path[bx][by+1]==5)) continue;
        //保证是0,1,2…k-1,0
        if((cur<k-1&&g[bx][by]==cur+1)||(cur==k-1&&g[bx][by]==0))
        {
            vis[bx][by]=1;
            path[x][y]=i;//记录当前点所移动的方向 
            dfs(bx,by,g[bx][by],s+to_string(i),dep+1);
            if(!ans.empty()) return;//不空表示已经第一次找到了,不用回溯 
            vis[bx][by]=0;
            path[x][y]=-1;//回溯则重置 
        }
    }
}
int main()
{
    cin>>n>>k;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            cin>>g[i][j];
            path[i][j]=-1;//初始化记录 
        }
    }
    string star;//初始空字符串
    vis[0][0]=1;//标记(0,0)已经被访问 
    dfs(0,0,0,star,1);
    if(!ans.empty()) cout<<ans;
    else cout<<"-1";
    return 0; 
}

相关文章:

  • 【Linux】Linux系统上大文件的分割与合并
  • Linux中find 命令的高级用法 组合条件 与、或、非(-a、-o、!) 以及通过 -regex 和 -iregex 选项使用正则表达式
  • Android Vulkan 官宣转正并统一渲染堆栈 ,这对 Flutter 又有什么影响?
  • 【Python】11、函数-01
  • OpenCV图像处理:分割、合并、打码、组合与边界填充
  • VS Code + Git 分支操作指南(附流程图)
  • 基于Redis实现共享token登录
  • pytorch小记(十四):pytorch中 nn.Embedding 详解
  • 机器学习之梯度消失和梯度爆炸
  • 1.5.2 掌握Scala内建控制结构 - 块表达式
  • 【css酷炫效果】纯CSS实现虫洞穿越效果
  • Rust + WebAssembly 实现康威生命游戏
  • java 之枚举问题(超详细!!!!)
  • MySQL(索引)
  • 华为ISC+战略规划项目数字化转型驱动的智慧供应链革新(169页PPT)(文末有下载方式)
  • 架构师面试(十七):总体架构
  • numpy学习笔记4:np.arange(0, 10, 2) 的详细解释
  • 深度学习零碎知识
  • 【C语言】自定义类型:结构体
  • Android 15 获取网络切片信息的标准接口
  • 多家国有大行存款利率即将迎来新一轮下调
  • 上海浦江游览南拓新航线首航,途经前滩、世博文化公园等景点
  • 上海中心城区首条“定制化低空观光航线”启航,可提前一天提需求
  • 长三角议事厅·周报|新能源汽车产业需寻求“第二增长曲线”
  • 对话作家吉井忍:“滚石”般的生活,让我看到多种人生可能
  • 永久基本农田竟沦为垃圾场,湖南湘潭回应:全面启动专项整治