第七届蓝桥杯java B组试题题解(仅代表个人观点)

来源:互联网 发布:网络lw代表什么意思 编辑:程序博客网 时间:2024/05/17 04:19

第六题:方格填数

如下的10个格子

| 这里写图片描述

#

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

public  class Main{       //将前后几个方法中都要用到的变量全部设为全局变量    static int a[][]=new int[5][6];//此处是将原图外围再包上一圈,                    //将原图中的边界元素                    //变成非边界元素,以使原图中                    //的边界元素避免麻烦的边界处理。                    //然后用二维数组a进行表达以方便后续处理。    static int []data={0,1,2,3,4,5,6,7,8,9};    static int count=0;//存储总的方案数    public static void main(String args[])    {           //先将数组a赋初值,且这个初值应远离0-9中任何        //一个数,后续只对        //除边界以外的数组元素进行赋值,则可默认边界        //不可能会与其他元素相邻。        for(int i=0;i<5;i++)        {            for(int j=0;j<6;j++)            {                a[i][j]=-2;            }        }        get_fullpermutation(data, 0);        System.out.print(count);    }    //对一种全排列情况进行判断    public static boolean judge(int [][]v)    {        for(int i=1;i<=3;i++)        {            for(int j=1;j<=4;j++)            {                if(i==1&&j==1||i==3&&j==4)                {                    continue;                }                int x=v[i][j]+1;                int y=v[i][j]-1;                if(x==v[i+1][j]||x==v[i-1][j]||x==v[i][j+1]||                    x==v[i][j-1]||x==v[i+1][j+1]||                        x==v[i-1][j-1]||                    x==v[i+1][j-1]||                    x==v[i-1][j+1])                {                    return false;                }                if(y==v[i+1][j]||y==v[i-1][j]||y==v[i][j+1]||                    y==v[i][j-1]||y==v[i+1][j+1]||                        y==v[i-1][j-1]||                        y==v[i+1][j-1]||                    y==v[i-1][j+1])                {                    return false;                }            }        }        return true;    }    //得到0-9的全排列并将其赋值于数组a,    public static void  get_fullpermutation(int []d,int k)    {        if(k==d.length)//每得到一种全排列就赋值一次并进行判断        {            int t=0;            for(int i=1;i<=3;i++)            {                for(int j=1;j<=4;j++)                {                    if(i==1&&j==1||i==3&&j==4)                    {                        continue;                    }                    else                    {                        a[i][j]=data[t];                        t++;                    }                }            }            if(judge(a))//judge函数返回true时即连续的两个数字不相邻            {                count++;            }        }        //全排列        for(int i=k;i<d.length;i++)        {            {int t=d[i];d[i]=d[k];d[k]=t;}            get_fullpermutation(d, k+1);            {int t=d[i];d[i]=d[k];d[k]=t;}        }    }}
0 0
原创粉丝点击