• 六角幻方


    /*把 1 2 3 ... 19 共19个整数排列成六角形状,如下:
    
        * * *
    
       * * * *
    
      * * * * *
    
       * * * *
    
        * * *
    
        要求每个直线上的数字之和必须相等。共有15条直线哦!
    
        再给点线索吧!我们预先填好了2个数字,第一行的头两个数字是:15 13,参见下图,黄色一行为所求。
    
       请你填写出中间一行的5个数字。数字间用空格分开。
    
       这是一行用空格分开的整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性的文字等)*/
    package test;
    
    public class 六角幻方 {
    static int[] table = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};  
        
        public static void main(String[] args){  
            int arr[] = new int[16];  
            boolean[] vis = new boolean[20];  
            vis[15] = vis[13] = vis[10] = true; //根据初始条件推出第一行的三个数,标记为使用过的 
            dfs(arr,0,vis);  
        }  
          
        static void dfs(int[] arr,int step, boolean[] vis){  //arr数组记录从第二行开始的数,step记录当前遍历的步数
            if(step == 4){  
                if(arr[0]+arr[1]+arr[2]+arr[3] != 38)  //五层要相等,(1+...+19)/5= 38,注意可判断的点
                    return ;  
            }else if(step == 5){  
                if(15+arr[0]+arr[4] != 38)  
                    return ;  
            }else if(step == 9){  
                if(arr[4]+arr[5]+arr[6]+arr[7]+arr[8] != 38 ||   
                        10+arr[3]+arr[8] != 38)  
                    return ;  
            }else if(step == 10){  
                if(13+arr[1]+arr[5]+arr[9] != 38)  
                    return ;  
            }else if(step == 13){  
                if(arr[9]+arr[10]+arr[11]+arr[12] != 38 ||  
                        13+arr[2]+arr[7]+arr[12] != 38)  
                    return ;  
            }else if(step == 14){  
                if(10+arr[2]+arr[6]+arr[10]+arr[13] != 38 ||  
                        arr[4]+arr[9]+arr[13] != 38)  
                    return ;  
            }  
            else if(step == 15){  
                if(arr[0]+arr[5]+arr[10]+arr[14] != 38 ||  
                        arr[3]+arr[7]+arr[11]+arr[14] != 38)  
                    return ;  
            }  
            else if(step == 16){  
                if(arr[13]+arr[14]+arr[15] != 38 ||  
                        15+arr[1]+arr[6]+arr[11]+arr[15] != 38 ||  
                        arr[8]+arr[12]+arr[15] != 38)  
                    return ;  
                print(arr);  
            }  
            for(int i = 0; i < table.length; ++i){  
                if(vis[table[i]] == false){  //如果该数未使用过,则使用arr数组记录下当前使用的数字
                    vis[table[i]] = true;  
                    arr[step] = table[i];  
                    dfs(arr,step+1,vis);  
                    vis[table[i]] = false;  
                }  
            }  
        }  
          
        static void print(int[] arr){  
            for(int i = 0; i < arr.length; ++i){  
                System.out.print(arr[i]+" ");  
            }  
            System.out.println();  
        }
    
    }
  • 相关阅读:
    bzoj 4446: [Scoi2015]小凸玩密室【树形dp】
    bzoj 4403: 序列统计【lucas+组合数学】
    bzoj 3745: [Coci2015]Norma【分治】
    bzoj 3232: 圈地游戏【分数规划+最小割】
    Codeforces 1000 (A~E)
    bzoj 4753: [Jsoi2016]最佳团体【01分数规划+二分+树上背包】
    bzoj 3872: [Poi2014]Ant colony【树形dp+二分】
    bzoj 2067: [Poi2004]SZN【贪心+二分+树形dp】
    洛谷 P1314 聪明的质监员【二分+前缀和】
    bzoj 4622: [NOI 2003] 智破连环阵【dfs+匈牙利算法】
  • 原文地址:https://www.cnblogs.com/ljs-666/p/8595616.html
Copyright © 2020-2023  润新知