24蓝桥省赛B-数字接龙

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=13;
int mp[N][N],flag,n,k;
bool vis[N][N];
int f[N][N][N][N];//存储路径,用于判断是否斜着走,是本题剪枝的难点
vector<int>ans;
vector<int>res;
int dx[]={-1,-1,0,1,1,1,0,-1};
int dy[]={0,1,1,1,0,-1,-1,-1};

bool check1(int x,int y){//坐标合法
    return x>=1&&x<=n&&y>=1&&y<=n;
}

bool check2(int x,int y,int i){//检查是否斜着走
    if(i==0||i==2||i==4||i==6) return true;
    if(i==1&&(f[x-1][y][x][y+1]||f[x][y+1][x-1][y])) return false;
    if(i==3&&(f[x][y+1][x+1][y]||f[x+1][y][x][y+1])) return false;
    if(i==5&&(f[x][y-1][x+1][y]||f[x+1][y][x][y-1])) return false;
    if(i==7&&(f[x][y-1][x-1][y]||f[x-1][y][x][y-1])) return false;
    return true;
}

void dfs(int x,int y,int cnt){//传过来的坐标一定合法、未访问等,line38剪去了不合法的情况
    if(flag) return ;//找到答案时,统统直接返回,也算是剪枝,节省时间
    /*事实上,走到n,n一定可以返回了,也算是种剪枝*/
    if(x==n&&y==n&&cnt==n*n){//走到(n,n)如果有解的话,以一个解即答案(字典序最小)
        res=ans;
        flag=1;
        return ;
    }
    vis[x][y]=1;
    for(int i=0;i<8;i++){
        int nx=x+dx[i];
        int ny=y+dy[i];
        //剪枝
        if(!check1(nx,ny)||vis[nx][ny]) continue;
        if((mp[x][y]+1)%k!=mp[nx][ny]) continue;
        if(!check2(x,y,i)) continue;

        f[x][y][nx][ny]=f[nx][ny][x][y]=1;
        ans.push_back(i);
        dfs(nx,ny,cnt+1);

        //回溯
        f[x][y][nx][ny]=f[nx][ny][x][y]=0;
        vis[nx][ny]=0;
        ans.pop_back();
    }
}

signed main()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)
        cin>>mp[i][j];
    }
    dfs(1,1,1);
    if(flag)
    for(auto i:res)
    cout<<i;
    else
    cout<<-1;
}

25/2/18

相关推荐
luj_17681 小时前
星火科技助力边远地区防病攻坚
c语言·开发语言·c++·经验分享·算法
木木子223 小时前
# 鸿蒙 ArkTS 实战:秒表 Stopwatch(示例 5)
数据结构·华为·list·harmonyos
geats人山人海4 小时前
数据结构第六章c语言 树的存储下二叉树的概念和存储
c语言·数据结构·算法
漂流瓶jz5 小时前
UVA-12627 奇怪的气球膨胀 题解答案代码 算法竞赛入门经典第二版
算法·图论·递归·aoapc·算法竞赛入门经典·uva·12627
jarvisuni5 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
kobesdu5 小时前
流形上的优化:SO(3)与SE(3)的广义加减法在FAST-LIO中如何简化状态估计
人工智能·算法·fastlio
白狐_7985 小时前
408 数据结构算法题 01:线性表暴力求解保分指南
java·数据结构·算法
乐观勇敢坚强的老彭6 小时前
C++信奥:开关门、开关灯问题
开发语言·c++·算法
冻柠檬飞冰走茶6 小时前
PTA基础编程题目集 7-31 字符串循环左移(C语言实现)
c语言·开发语言·数据结构·算法
Hi李耶6 小时前
【LeetCode】4-寻找两个正序数组的中位数
算法·leetcode·职场和发展