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

每日一题(小白)回溯篇7

首先我们可以判断出这是一个dfs的题目,因为简言之就是要求最短路径。其次这个题目与直接找最短路径有所不同,增加了条件必须依次穿过指定的符号。无论坦克走到任何一点都有四个方向可以走(越界要判断),结束的条件是到达指定的终点。本题不难看出可以判断每次的步数,若已经大于目前的结果数据直接跳出循环(剪枝)。

①字符数组存储字符有

②接收起点x1,y1和终点x2,y2

③开始向前走

④判断结束条件,判断边界条件,判断是否已走过,判断交替条件

⑤如果满足条件,当前位置为true;进入递归

⑥回溯,退出循环

⑦剪枝

⑧调用函数输出结果

代码如下👇

	static int n;static int result=(int)1e9;static char[][] c;static boolean[][] b= new boolean[110][110];static int x1,x2,y1,y2;static int[] dx= {0,-1,1,0};static int[] dy= {1,0,0,-1};//四个方向static int[][]  arr=new int[1000][1000];//结果数组public static void dfs(int x,int y,int ans,char f) {if (ans>result) {return;}if (x==x2 && y==y2) {result=Math.min(ans, result);}for (int i = 0; i < 4; i++) {int x3=x+dx[i];int y3=y+dy[i];if (x3<1 || x3>n || y3<1 || y3>n) {continue;}if (b[x3][y3]) {continue;}if (c[x3][y3] == f) {continue;}b[x3][y3]=true;dfs(x3,y3,ans+1,c[x3][y3]);b[x3][y3]=false;//回溯精髓差点忘了}}public static void main(String[] args) {Scanner scan = new Scanner(System.in);n=scan.nextInt();scan.nextLine();c=new char[110][110];for (int i = 1; i <= n; i++) {String s=scan.nextLine();s=s.replaceAll(" ", "");for (int j = 0; j < n; j++) {c[i][j+1]=s.charAt(j);}}for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {if (c[i][j]=='A') {x1=i;y1=j;}if (c[i][j]=='B') {x2=i;y2=j;}}}
//		System.out.println(x1+" "+y1+" "+x2+" "+y2);
//		for (int i = 1; i <= n; i++) {
//			for (int j = 1; j <= n; j++) {
//				System.out.print(c[i][j]);
//			}
//			System.out.println();
//		}测试点dfs(x1,y1,0,'A');if (result!=(int)1e9) {System.out.println(result);}else {System.out.println(-1);}scan.close();}

下面为注释代码,如果理解不透可以参考👇

	static int n;//给定大小static int result=(int)1e9;//最大值初始化结果static char[][] c;//雷区static boolean[][] b= new boolean[110][110];//雷区的复制 static int x1,x2,y1,y2;//起点终点static int[] dx= {0,-1,1,0};static int[] dy= {1,0,0,-1};//四个方向static int[][]  arr=new int[1000][1000];//结果数组public static void dfs(int x,int y,int ans,char f) {if (ans>result) {//剪枝return;}if (x==x2 && y==y2) {//到达终点result=Math.min(ans, result);//保存最短的}for (int i = 0; i < 4; i++) {//向前走int x3=x+dx[i];int y3=y+dy[i];if (x3<1 || x3>n || y3<1 || y3>n) {//是否越界continue;}if (b[x3][y3]) {//是否走过continue;}if (c[x3][y3] == f) {//是否交替进入continue;}b[x3][y3]=true;//进入递归dfs(x3,y3,ans+1,c[x3][y3]);b[x3][y3]=false;//回溯精髓差点忘了}}public static void main(String[] args) {Scanner scan = new Scanner(System.in);n=scan.nextInt();scan.nextLine();c=new char[110][110];for (int i = 1; i <= n; i++) {//存储给定雷区String s=scan.nextLine();s=s.replaceAll(" ", "");for (int j = 0; j < n; j++) {c[i][j+1]=s.charAt(j);}}for (int i = 1; i <= n; i++) {//终点起点保存for (int j = 1; j <= n; j++) {if (c[i][j]=='A') {x1=i;y1=j;}if (c[i][j]=='B') {x2=i;y2=j;}}}dfs(x1,y1,0,'A');//调用if (result!=(int)1e9) {System.out.println(result);//输出结果}else {System.out.println(-1);//无结果输出-1}scan.close();}

相关文章:

  • Vue中如何优雅地阻止特定标签的移除并恢复其原始位置
  • 剑指Offer(数据结构与算法面试题精讲)C++版——day17
  • [c语言日寄]免费文档生成器——Doxygen在c语言程序中的使用
  • 特伦斯便携钢琴V20有哪些优势
  • [预备知识]1. 线性代数基础
  • 4月21日星期一今日早报简报微语报早读
  • 颠覆传统!毫秒级响应的跨平台文件同步革命,远程访问如本地操作般丝滑
  • FTTR 全屋光纤架构分享
  • 【原创】Ubuntu20.04 安装 Isaac Gym 仿真器
  • 视频分析设备平台EasyCVR安防视频小知识:安防监控常见故障精准排查方法
  • init_tcicb函数有调用,但snapshot函数没调用
  • Spring AOP优化in查询,性能提升巨大
  • Unreal如何使用后处理材质实现一个黑屏渐变效果
  • Linux常见指令介绍中(入门级)
  • VSCode远程图形化GDB
  • 【React】获取元素距离页面顶部的距离
  • 多维度信息捕捉:利用向量、稀疏向量、全文搜索及张量实现RAG的极致性能
  • 随机面试--<二>
  • 可穿戴无线生理信号采集贴片产品市场需求简析
  • DevOps功能详解
  • 在因关税战爆火的敦煌网上,美国人爱买什么中国商品
  • 经济日报:锚定重点领域和关键环节,上海浦东谋划高水平对外开放
  • 哈萨克斯坦一名副市长遭枪击
  • 尹锡悦涉嫌发动内乱案第二次庭审举行
  • 用8年还原曹操墓鉴定过程,探寻曹操墓新书创作分享会举行
  • 中方决定对在涉港问题上表现恶劣的美国国会议员等实施制裁