• 反幻方


    /*我国古籍记载着
     * 294
     * 753
     * 618
     * 这是一个三阶幻方。每行每列以及对角线上的数字相加都相等
     * 考虑一个相反问题
     * 用1-9的数字填入九宫格使得每行每列对角线上数字和都不相等,搜索所有的三阶反幻方并统计一共有多少种,旋转或镜像算一种*/
    package test;
    
    public class 反幻方 {
        static int count=0;
        static void swap(char[] s,int a,int b){
            char temp=s[a];
            s[a]=s[b];
            s[b]=temp;
        }
        public static void dsf(char[] arr,int k,int length){//用k记录当前遍历到的数字位数
            if(k==length){//若填入九宫格使得每行每列对角线上数字和都不相等,则count++;
                if(arr[0]+arr[1]+arr[2]!=arr[3]+arr[4]+arr[5]&&arr[0]+arr[1]+arr[2]!=arr[6]+arr[7]+arr[8]&&arr[0]+arr[1]+arr[2]!=arr[3]+arr[0]+arr[6]&&arr[0]+arr[1]+arr[2]!=arr[1]+arr[4]+arr[7]&&arr[0]+arr[1]+arr[2]!=arr[5]+arr[2]+arr[8]&&arr[0]+arr[1]+arr[2]!=arr[0]+arr[4]+arr[8]&&arr[0]+arr[1]+arr[2]!=arr[2]+arr[4]+arr[6])  
                    if(arr[3]+arr[4]+arr[5]!=arr[6]+arr[7]+arr[8]&&arr[3]+arr[4]+arr[5]!=arr[0]+arr[3]+arr[6]&&arr[3]+arr[4]+arr[5]!=arr[1]+arr[4]+arr[7]&&arr[3]+arr[4]+arr[5]!=arr[2]+arr[8]+arr[5]&&arr[3]+arr[4]+arr[5]!=arr[0]+arr[4]+arr[8]&&arr[3]+arr[4]+arr[5]!=arr[2]+arr[4]+arr[6])  
                        if(arr[6]+arr[7]+arr[8]!=arr[0]+arr[3]+arr[6]&&arr[6]+arr[7]+arr[8]!=arr[1]+arr[4]+arr[7]&&arr[6]+arr[7]+arr[8]!=arr[2]+arr[8]+arr[5]&&arr[6]+arr[7]+arr[8]!=arr[0]+arr[4]+arr[8]&&arr[6]+arr[7]+arr[8]!=arr[2]+arr[4]+arr[6])  
                            if(arr[0]+arr[3]+arr[6]!=arr[1]+arr[4]+arr[7]&&arr[0]+arr[3]+arr[6]!=arr[2]+arr[8]+arr[5]&&arr[0]+arr[3]+arr[6]!=arr[0]+arr[4]+arr[8]&&arr[0]+arr[3]+arr[6]!=arr[2]+arr[4]+arr[6])  
                                if(arr[1]+arr[4]+arr[7]!=arr[2]+arr[8]+arr[5]&&arr[1]+arr[4]+arr[7]!=arr[0]+arr[4]+arr[8]&&arr[1]+arr[4]+arr[7]!=arr[2]+arr[4]+arr[6])  
                                    if(arr[2]+arr[5]+arr[8]!=arr[0]+arr[4]+arr[8]&&arr[2]+arr[5]+arr[8]!=arr[2]+arr[4]+arr[6])  
                                        if(arr[0]+arr[4]+arr[8]!=arr[2]+arr[4]+arr[6])  
                                            count++;
                return;
            }
            for(int i=k;i<=length;i++){//每次递归从当前位数向后递归
                swap(arr,i,k);
                dsf(arr,k+1,length);
                swap(arr,i,k);
                
            }
        }
        public static void main(String arg[]){
            char[] arr="123456789".toCharArray();
            dsf(arr,0,8);//使用数组来表示九宫格,搜索范围从0-8共9个数
            System.out.print(count/8);//除去旋转(4)和镜像(2),2*4=8
        }
    
    }
  • 相关阅读:
    前端学习 -- Css -- 盒子模式
    前端学习 -- Css -- 文本样式
    Shell脚本学习
    前端学习 -- Css -- 行间距
    前端学习 -- Css -- 字体的几个属性学习
    前端学习 -- Css -- 字体分类
    前端学习 -- Css -- 字体
    前端学习 -- 颜色
    前端学习 -- 长度单位
    前端学习 -- Css -- 定义列表
  • 原文地址:https://www.cnblogs.com/ljs-666/p/8612775.html
Copyright © 2020-2023  润新知