杭电ACM OJ 1016 Prime Ring Problem 回溯法+ 高效判断素数 快速轻松解决

简单易理解的回溯法,高效判断素数,可以看我另外两篇博客,这里我也快速简要讲一下。


这一题主要是要领悟回溯法,很关键。

先写一个正常的n个数的求各种排列情况。就1到。。n。的各种排列情况。

方法:正常思路是第一个位置有n种情况,你要写一个长度n的for循环,第二个位置自然是n-1种情况,所以要写一个长度n的for循环,以此类推。。。但是问题来了,你怎么知道传进来的n是多少?你又要写几个for循环?所以你需要用回溯法来递归处理这个情况(当然也有不用递归的方法)。你需要写这样一个方法:你需要写一个标记数组,用来标记这个数字是否访问过了。还有一个标记当前正在处理哪个位数的level,如果level是0,那就是正在为第一位找,所以说不管从哪个位置开始找,方法都是一样的,唯一不同的是你正在为哪一位找以及有哪些数组已经用过了。

上代码

private void sort(int level) {
    for (int i = 0; i < n; i ++) {
        if (!flag[i]) {
            current[level] = i + 1;
            flag[i] = true;//比如倒数第二层:锁一个
            if (level != n - 1) {
                sort(level + 1);//留一个给最后一层
            } else {
                System.out.println(Arrays.toString(current));
            }
            flag[i] = false;//
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值