蓝桥杯真题——数字三角形(深度优先搜索)

蓝桥杯真题———数字三角形

我还是个小白分享一下,不过这个题做的还是有一点问题,有一部分样例过不了,欢迎大佬纠正。

我看了一下别人的博客,好像有很多人没有考虑到左右次数不能超过1的条件。

因为刚接触算法许多的算法都还没记过,做得可能相对比较复杂,请见谅!

import java.util.Scanner;

public class 第8题 {
	static int max=0;
	static int left=0;//计算左边的次数
	static int rignt=0;//计算右边的次数
	static int i=0;//纯粹为了方便
	static int j=0;
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int num=sc.nextInt();//接收有几行数字
		int[][] nums=new int[num][num]; //进行储存数字
		for (int i2 = 0; i2 < num; i2++) {
			for (int j2 = 0; j2 <= i2; j2++) {
				nums[i2][j2]=sc.nextInt();
			}
		}
		int mac=nums[0][0];//储存第一行的值
		int[][] book=new int[num][num];//进行标记
		int[][] sign=new int[num][num];//用来重置需要重置的标记
		int[][] key=new int[num][num];//判断上一次是向左加还是向右加
		dft(mac, book, nums, num, sign, key);
		System.out.println(max);//输出最大值
	}
	public static void dft(int mac,int[][] book,int[][] nums,int num,int[][] sign,int[][] key) {
		if (i==num-1) {
			if (rignt==left||rignt==left-1||rignt==left+1) {
				if (mac>max) {
					max=mac;
				}
			}
		}//判断完整的一次是否运行完,并对满足条件的情况储存最大值
		if (j==num-1) {
			return;
		}//执行完最后一次,并输出
		if (i+1<num&&(book[i+1][j]==0||book[i+1][j+1]==0)) {
			if (book[i+1][j]==0) {
				book[i+1][j]=1;
				i++;
				left++;//向左下
				key[i][j]=1;
				mac+=nums[i][j];//计算它们的和
				dft(mac, book, nums, num,sign,key);//进入下一次运算
			}//对运行过的点进行标记
			else if(book[i+1][j+1]==0) {
				book[i+1][j+1]=1;
				i++;
				j++;
				rignt++;//向右下
				key[i][j]=2;
				mac+=nums[i][j];//计算它们的和
				dft(mac, book, nums, num,sign,key);//进入下一次运算
			}
		}
		else {
			i--;//计算下一轮的值,进行后退
			mac-=nums[i+1][j];
			if (key[i+1][j]==2) {
				j--;
				rignt--;
			}
			else {
				left--;
			}//进行左右次数的计算
			if (sign[i][j]==0) {//判断该标记是否需要重置
				for (int c=i; c < num; c++) {
					for (int k = j+1; k <= c; k++) {
						book[c][k]=0;
					}
				}
				sign[i][j]=1;//表示此标记已重置
			}
			dft(mac, book, nums, num,sign,key);//进行下一次计算
		}
	}
}

能力有限,请见谅

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小先生812

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

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

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

打赏作者

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

抵扣说明:

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

余额充值