备考蓝桥杯(18)方格填数 java实现

package pers.robert.lanqiaobei07;
/**
 * 
方格填数

如下的10个格子
   +--+--+--+
   |  |  |  |
+--+--+--+--+
|  |  |  |  |
+--+--+--+--+
|  |  |  |
+--+--+--+

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

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

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

请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
 * @author Robert
 *
 */
public class The06PutNumberDemo1_question {
	static int sum = 0 ;
	     public static void main(String[] args) {
	        int a[] = {0,1,2,3,4,5,6,7,8,9};
	        int b[] = new int[10];
	          String s = "";
	          f(a,b,0,s);
	          System.out.println(sum);
	   }
	     private static void f(int[] a,int[] b,int k,String s) {
	         if(k!=0 && k!=1 && k!=4 && k!=8 ){//非左侧第一排元素,只要左侧元素比右侧元素小一,就return;左侧
	             if(Math.abs(b[k-1]-b[k-2])==1) return;
	         }
	        if(k>=4 && k<=10 && k!=7){//第二排和第三排除了第7个元素,右上角
            if(Math.abs(b[k-1]-b[k-4])==1) return;
	         }
	        if(k>=5 && k<=10){//第二排和第三排正上方
	             if(Math.abs(b[k-1]-b[k-5])==1) return;
	       }
	         if(k==6 || k==7 || k==9 || k==10){//左上方
	             if(Math.abs(b[k-1]-b[k-6])==1) return;
	         }
	        
	         if(k==a.length) {
	             sum++;
	            System.out.println(s);
	             return;
	        }
	        for(int i=0;i<a.length;i++){
	             String ss = s;
	             if(a[i]==-1) continue;
	            b[k] = a[i];
	            ss += a[i];
	             a[i] = -1;
	            f(a,b,k+1,ss);
	            a[i] = b[k];
	        }
	   }
}

分析:

	        for(int i=0;i<a.length;i++){
	             String ss = s;
	             if(a[i]==-1) continue;
	            b[k] = a[i];
	            ss += a[i];
	             a[i] = -1;
	            f(a,b,k+1,ss);
	            a[i] = b[k];
	        }

这里是全排列+回溯



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值