第七届蓝桥杯第6题:方格填数

版权声明:版权归wsc所有 https://blog.csdn.net/qq_37543808/article/details/79651260

如果显示有问题,也可以参看【图1.jpg】)

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

一共有多少种可能的填数方案?(数字不能重复使用)

请填写表示方案数目的整数。

博主用全排列的方法写的算法



import java.util.Arrays;

public class ListBox {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        int an[]=new int[10];
        for(int i=0;i<an.length;i++)
        {
            an[i]=i;
        }
 
        List perm=new List(an);
        System.out.println(perm.count);
    }

}



class List{
    
     int a[];
     int list[]=new int[30];
     int count=0;


     void print(){
    //扩大格子,并给格子赋值    
        for(int x=0;x<list.length;x++)
            {
                list[x]=12;
            }  
         list[8]=a[0];
         list[9]=a[1];
         list[10]=a[2];
         list[13]=a[3];
         list[14]=a[4];
         list[15]=a[5];
         list[16]=a[6];
         list[19]=a[7];
         list[20]=a[8];
         list[21]=a[9];
        for(int x=0;x<list.length;x++)
        {
            if(list[x]/10!=0)
            {
                continue;
            }                 
            if(!check(x))
                {
                  return;                    //如果不符合,结束print()方法
                }
     
        }
        
        count++;
  
     }

     public List(int[] a)
     {
                 
                 this.a=a;
                 perm(0);            
     }    
     boolean check(int ps)
     {

         if(Math.abs(list[ps]-list[ps-6])==1||Math.abs(list[ps]-list[ps-7])==1||Math.abs(list[ps]-list[ps-5])==1
                 ||Math.abs(list[ps]-list[ps-1])==1||Math.abs(list[ps]-list[ps+1])==1||Math.abs(list[ps]-list[ps+6])==1
                 ||Math.abs(list[ps]-list[ps+5])==1||Math.abs(list[ps]-list[ps+7])==1)
         {
             return false;
         }
        
        
         return true;
     }
    
    
     void perm(int offset)
     {
         if(offset==a.length-1)
         {
             print();
             return;
         }
         else
         {
              for(int i=offset;i<a.length;i++)
              {
                  swap(i,offset);
                  perm(offset+1);
                  swap(offset,i);
              }
         }
     }
     void swap(int i,int offset)
     {
         int temp;
         temp=a[i];
         a[i]=a[offset];
         a[offset]=temp;
        
     }
    
}

大家都看出来了,我这里吧十个格子扩展格子成了30个5X6的,这样每个都可以检查周围8个格子了




猜你喜欢

转载自blog.csdn.net/qq_37543808/article/details/79651260