方格填数
填入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); } }