美文网首页
蓝桥杯填方格-填数问题

蓝桥杯填方格-填数问题

作者: crishawy | 来源:发表于2019-02-28 21:19 被阅读0次

问题描述

方格填数

如下的10个格子


思路

填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)

一共有多少种可能的填数方案?

请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

解决思路

该题是一个填数问题,要求将0~9各个数字填入10个方格中,并且连续数字不相邻,填数的策略可以以从左到右,从上到下的顺序填入。易发现,该问题可以分解为当前还需填入多少个满足要求的数字,当该子问题规模为0时,可以得到解决,因此具有最优子结构的性质,易使用递归实现。

  • 递归边界条件:当所需要填的数为0,输出填数方案
  • 递归式:循环遍历能够填入的数字,选择其中一个数字填入,递归填入满足条件更多的数,当所需填入数的个数为0时,返回

代码实现

package lanqiao.seven;

public class Six {

    //define the schema numbers
    private static int count = 0;
    
    public static void main(String[] args) {
        //define numbers:0~9
        int[] a= {0,1,2,3,4,5,6,7,8,9};
        //define grid
        int[] b = new int[10];
        //initialize
        for(int i=0;i<10;i++)
            b[i] = 100;
        fill(a,b,0,a.length);
        System.out.println(count);
    }
    
    public static void fill(int a[],int b[],int k,int n) {
        //fill by order,left to right,top to bottom
        
        //check whether adjacent first
        if(k>=5&&k<=10) {
            //upper adjacent
            if(isAdjacent(b[k-1],b[k-5])) return;
        }
        if(k>=2&&k<=3||k>=5&&k<=7||k>=9&&k<=10)
            //left adjacent
            if(isAdjacent(b[k-1],b[k-2])) return;
        if(k>=6&&k<=7||k>=9&&k<=10)
            //left upper adjacent
            if(isAdjacent(b[k-1],b[k-6])) return;
        if(k>=4&&k<=6||k>=8&&k<=10)
            //right upper adjacent
            if(isAdjacent(b[k-1],b[k-4])) return;
        
        //end condition
        if(k==n) {
            count ++ ;
            // print the reasonable solution
            for(int i=0;i<b.length;i++)
                System.out.print(b[i]);
            System.out.println();
            return;
        }
        
        //add a non-repeated number
        for(int i=0;i<a.length;i++) {
            //a[i]=-1 represents that a[i] is used before
            if(a[i] == -1) continue;
            b[k] = a[i];
            a[i] = -1; //used flag
            //enter the next recursive layer
            fill(a,b,k+1,n);
            //if b[k] = a[i] does not work, change an a[i]
            a[i] = b[k];
        }
    }
    
    public static boolean isAdjacent(int n1, int n2) {
        return Math.abs(n1-n2) == 1;
    }
}

相关文章

  • 蓝桥杯填方格-填数问题

    问题描述 方格填数 如下的10个格子 填入0~9的数字。要求:连续的两个数字不能相邻。(左右、上下、对角都算相邻)...

  • [蓝桥杯2016初赛]方格填数

    题目描述 如下的10个格子,填入0~9的数字。要求:连续的两个数字不能相邻。(左右、上下、对角都算相邻)一共有多少...

  • [蓝桥杯2015决赛]方格填数

    题目描述 在2行5列的格子中填入1到10的数字。要求:相邻的格子中的数,右边的大于左边的,下边的大于上边的。如下图...

  • 方格填数

    原博 方格填数 如下的10个格子填入0~9的数字。要求:连续的两个数字不能相邻。(左右、上下、对角都算相邻)一共有...

  • dfs_第七届蓝桥杯方格填数

    方格填数 填入0~9的数字。要求:连续的两个数字不能相邻。 (左右、上下、对角都算相邻) 一共有多少种可能的填数方...

  • 填相同数问题

    昨天在课堂上讲“在同一个算式的方框里填上相同的数”的问题。例:30-( )=22+( ),这道题对学生来说有一定困...

  • 蛇形填数 / 回形填数

  • 蓝桥杯 方格分割

    标题:方格分割 6x6的方格,沿着格子的边线剪开成两部分。要求这两部分的形状完全相同。 如图:p1.png, p2...

  • 蛇形填数

  • 填字游戏

    你把文字填进饱满的方格每一场意外都是注定每一次发现都是巧合 我走不出一张纸也填不满所有的方格只能看着拼出的词汇没脚...

网友评论

      本文标题:蓝桥杯填方格-填数问题

      本文链接:https://www.haomeiwen.com/subject/umqluqtx.html