2016蓝桥杯国赛javaB组-B题反幻方(不同于其它答案的九重for循环➕判断)

解题思想:全排列➕去重操作

全排列核心代码部 

for(int i=begin;i<end;i++) {
                int temp=n[i];
                n[i]=n[begin];
                n[begin]=temp;
                
                qpl(n, begin+1, end);
                temp=n[i];
                n[i]=n[begin];
                n[begin]=temp;    
            }

去重操作代码部

if(begin==end) {
            HashSet<Integer>check=new HashSet<Integer>();
            check.add(n[0]+n[1]+n[2]);
            check.add(n[3]+n[4]+n[5]);
            check.add(n[6]+n[7]+n[8]);
            check.add(n[0]+n[3]+n[6]);
            check.add(n[1]+n[4]+n[7]);
            check.add(n[2]+n[5]+n[8]);
            check.add(n[0]+n[4]+n[8]);
            check.add(n[2]+n[4]+n[6]);
            if(check.size()==8) {
                sum++;
            }    
        }

 

整体:

package 一六javaB组决赛;

import java.util.HashSet;

public class B{
    static int sum=0;
    static HashSet<int[]>hash=new HashSet<int[]>();
    public static void qpl(int n[],int begin,int end) {
        if(begin==end) {
            HashSet<Integer>check=new HashSet<Integer>();
            check.add(n[0]+n[1]+n[2]);
            check.add(n[3]+n[4]+n[5]);
            check.add(n[6]+n[7]+n[8]);
            check.add(n[0]+n[3]+n[6]);
            check.add(n[1]+n[4]+n[7]);
            check.add(n[2]+n[5]+n[8]);
            check.add(n[0]+n[4]+n[8]);
            check.add(n[2]+n[4]+n[6]);
            if(check.size()==8) {
                sum++;
            }    
        }
        else {
            for(int i=begin;i<end;i++) {
                int temp=n[i];
                n[i]=n[begin];
                n[begin]=temp;
                
                qpl(n, begin+1, end);
                temp=n[i];
                n[i]=n[begin];
                n[begin]=temp;    
            }
        }
    }
    
    public static void main(String[] args) {
        int n[]= {1,2,3,4,5,6,7,8,9};
        qpl(n,0,9);
        System.out.print(sum/8);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值