路径之谜
题目链接:https://www.lanqiao.cn/problems/89/learning/?page=1&first_category_id=1&second_category_id=3
题意:
给定一个n*n的grid,每一行,每一列的都有经过次数的要求。要求输出从左上角到达右下角的路径信息(答案唯一)(每个格子只能走一遍)
思路:
通过dfs进行回溯
即当 发现从某个点为起点出发,无法满足结束条件时,回溯路径信息
具体来讲,以某个点出发。需要先将两个题目要求的方向数组+1,并且ans数组要pb(k),并且vis=true。当结束了4个循环发现f不为true,说明这条路不行,回溯。
#include<bits/stdc++.h> #define rep(i,a,n) for(int i=a;i<=n;i++) #define pb push_back #define endl "\n" #pragma GCC optimize(3) using namespace std; typedef long long ll; typedef pair<int,int> pii; const int inf=0x3f3f3f3f; const ll llmax=LLONG_MAX; const int maxn=1e5+5; int n; int a[25]; int b[25]; bool vis[25][25]; int res(int x,int y){ return n*(x-1)+(y-1); }//计算格子编号的函数 int dx[]={1,-1,0,0}; int dy[]={0,0,1,-1}; int c[25]; int d[25]; bool f=false; vector<int>ans; void dfs(int x,int y) { int k=res(x,y); if(f){ return; } if(c[y]+1>a[y]||d[x]+1>b[x])return; if(x==n&&y==n){ c[y]++; d[x]++; rep(i,1,n){ if(c[i]!=a[i]||d[i]!=b[i]){ c[y]--; d[x]--;return; } } f=true;return; } ans.pb(k); c[y]++; d[x]++; vis[x][y]=true; rep(i,0,3){ int nx=x+dx[i]; int ny=y+dy[i]; if(nx<1||nx>n||ny<1||ny>n||vis[nx][ny])continue; dfs(nx,ny); if(f)return; } ans.pop_back(); c[y]--; d[x]--; vis[x][y]=false; } signed main() { ios::sync_with_stdio(false),cin.tie(0); cin>>n; rep(i,1,n){ cin>>a[i]; } rep(i,1,n){ cin>>b[i]; } dfs(1,1); for(int i=0;i<ans.size();i++){ cout<<ans[i]<<' '; } cout<<res(n,n); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现