蓝桥杯第七届省赛(JavaB)方格填数


方格填数

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

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

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

我的思路就是把这10个格子按照0-9进行编号,接着对所有情况进行全排列,最后把全排列的结果进行检测,看是否符合题目所给的条件.我一共分两个类进行描述.其中Graph类为图(详见《算法》(第四版)中关于图的API)

检查每一个格子所在的邻接表(HashSet数组一共十个顶点,每个顶点保存着相邻顶点),用Contest_6类中的bs方法判断相邻两个格子当中的数字是否相邻(有点绕啊).总的思路就是这样,答案是1580

import java.util.HashSet;
public class Contest_6 {
    static int count=0;
static void f(Graph g,int[] arr,int n){
    
    if(n==arr.length-1){if(isPath(g,arr)) count++;return;}
    for(int x=n;x<arr.length;x++){
        int t=arr[x];arr[x]=arr[n];arr[n]=t;
        f(g,arr,n+1);
        t=arr[x];arr[x]=arr[n];arr[n]=t;
    }
}
static boolean isPath(Graph g,int[] a){
for(int i=0;i<10;i++)
    for(int w:g.adj[i]){
        if(bs(a[i],a[w])) return false;
    }
return true;
}
static boolean bs(int a,int b){
    if(Math.abs(a-b)==1) return true;
    else return false;
}
    public static void main(String[] args) {
        // TODO Auto-generated method stub
Graph g=new Graph();
int[] a={0,1,2,3,4,5,6,7,8,9};
f(g,a,0);
System.out.println(count);
    }

}
class Graph{
    int[] arr={0,4,1,5,2,6,3,7,4,8,5,9,0,1,1,2,3,4,4,5,5,6,7,8,8,9,0,3,0,5,1,4,1,6,2,5,4,7,3,8,4,9,5,8,6,9};
    HashSet<Integer>[] adj;

    Graph(){
        adj=(HashSet<Integer>[]) new HashSet[10];
        for(int i=0;i<adj.length;i++)
        {
            adj[i]=new HashSet<Integer>();
        }
        int x=0;
        while(x<arr.length){
            addEdge(arr[x],arr[x+1]);
            x+=2;
        }
            
    }
    void addEdge(int a,int b){
    adj[a].add(b);
    adj[b].add(a);
    }
    
}

 

转载于:https://www.cnblogs.com/didudi/p/6425548.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值