第七屆藍橋杯 省賽 JavaB組 方格填數



方格填數


如下的10個格子

(如果顯示有問題,也可以參看【圖1.jpg】)


填入0~9的數字。要求:連續的兩個數字不能相鄰。
(左右、上下、對角都算相鄰)


一共有多少種可能的填數方案?


請填寫表示方案數目的整數。

注意:你提交的應該是一個整數,不要填寫任何多餘的內容或說明性文字。


答案:1580


思路:

package com.test.zx;

public class Main {
	public static int count = 0 ;   //記錄方案數
    public static boolean isVisit[] = new boolean[10] ; //判斷一個數是否被訪問過 
    public static int a[][] = new int[3][4] ;   //填入方格里的數
    public static void main(String args[]){
        for(int i = 0 ; i < 3 ; i ++){  //初始化數據,(除了-1到10之間)的數都可行,這裏初始化爲-2
            for(int j = 0 ; j < 4 ; j++){
                a[i][j] = -2 ;
            }
        }
        for(int num = 0 ; num < 10 ; num++){//初始化所有數字均未填入
            isVisit[num] = false ;
        }
        find(0,1) ;
        System.out.println(count);
    }
    private static void find(int i, int j) {
        if(i == 2&&j==3){   //判斷是否填入最後一個格子,若是的則方案數+1
            count++ ;
        }
        for(int num = 0 ; num < 10 ;num++){ //將0到9都填入該方格,看是否可行
            if(judge(num,i,j)&&!(isVisit[num])){    //若可行
                a[i][j] = num ; //將該數填入方格
                isVisit[num] = true ;   //並且將該數字設定爲以訪問
                if(j==3){   //若查詢到達列尾
                    find(i+1,0) ;   //遞歸查詢下一行
                }else{
                    find(i,j+1) ;   //遞歸查詢下一列
                }
                //重置該方格的狀態,以便下一個數填入
                a[i][j] = -2 ;  
                isVisit[num] = false ;
            }
        }
    }
    private static boolean judge(int num, int i, int j) {//判斷相鄰格子的數字是否連續
        if(i-1>=0 && (a[i-1][j] == num+1 || a[i-1][j] == num-1)){   //判斷上方格子
            return false ;
        }
        if(j-1>=0 && (a[i][j-1] == num+1 || a[i][j-1] == num -1)){  //判斷左方格子
            return false ;
        }
        if(i-1>=0 && j-1 >= 0 && (a[i-1][j-1] == num+1 || a[i-1][j-1] == num - 1)){ //判斷左上方格子
            return false ;
        }
        if(i-1>=0 && j+1 < 4 && (a[i-1][j+1] ==num+1 || a[i-1][j+1] == num - 1)){   //判斷右上方格子
            return false ;
        }
        if(j+1<4 && (a[i][j+1] == num+1 || a[i][j+1] == num-1)){    //判斷右方格子
            return false ;
        }
        if(i+1<3 && (a[i+1][j] == num+1 || a[i+1][j] == num-1)){    //判斷下方格子
            return false ;
        }
        if(i+1<3 && j-1>=0 && (a[i+1][j-1] == num+1 || a[i+1][j-1] == num-1)){  //判斷左下方格子
            return false ;
        }
        if(i-1<0 && j+1<4 && (a[i+1][j+1] == num+1 || a[i+1][j+1] == num-1)){   //判斷右下方格子
            return false ;
        }
        return true ;
    }
}


public class Main{
	static int count=0;//計數共有多少種情況
	public static void main(String[]args){
		int a[]=new int[12];//三行四列12個數
		boolean visit[]=new boolean[10];//填入a[1]-a[10]共10個數
		dfs(a,visit,1);
		System.out.println(count);
	}
	public static void dfs(int a[],boolean visit[],int num){
		if(num==11){//10個數全部填入
			if(judge(a)){
				count++;
			}
			return;
		}
		for(a[num]=0;a[num]<10;a[num]++){//遞歸從a[1]開始填數
			if(visit[a[num]]==false){
				visit[a[num]]=true;
				num+=1;
				dfs(a, visit, num);//遞歸,填下一個數
				num-=1;
				visit[a[num]]=false;
			}
		}
	}
	public static boolean judge(int a[]){
		if ((a[1]==a[2]+1||a[1]==a[2]-1)||  
                (a[1]==a[6]+1||a[1]==a[6]-1)||  
                (a[1]==a[5]+1||a[1]==a[5]-1)||  
                (a[1]==a[4]+1||a[1]==a[4]-1)) {  
            return false;  
        }else if ((a[2]==a[5]+1||a[2]==a[5]-1)||  
                (a[2]==a[3]+1||a[2]==a[3]-1)||  
                (a[2]==a[7]+1||a[2]==a[7]-1)||  
                (a[2]==a[6]+1||a[2]==a[6]-1)) {  
            return false;  
        }else if ((a[3]==a[6]+1||a[3]==a[6]-1)||  
                (a[3]==a[7]+1||a[3]==a[7]-1)) {  
            return false;  
        }else if ((a[4]==a[5]+1||a[4]==a[5]-1)||  
                (a[4]==a[8]+1||a[4]==a[8]-1)||  
                (a[4]==a[9]+1||a[4]==a[9]-1)) {  
            return false;  
        }else if ((a[6]==a[7]+1||a[6]==a[7]-1)||  
                (a[6]==a[10]+1||a[6]==a[10]-1)||  
                (a[6]==a[9]+1||a[6]==a[9]-1)) {  
            return false;  
        }else if (a[7]==a[10]+1||a[7]==a[10]-1) {  
            return false;  
        }else if (a[8]==a[9]+1||a[8]==a[9]-1) {  
            return false;  
        }else if (a[9]==a[10]+1||a[9]==a[10]-1) {  
            return false;  
        }else if ((a[5]==a[6]+1||a[5]==a[6]-1)||  
                (a[5]==a[10]+1||a[5]==a[10]-1)||  
                (a[5]==a[9]+1||a[5]==a[9]-1)||  
                (a[5]==a[8]+1||a[5]==a[8]-1)) {  
            return false;  
        }  
        return true;  
    }  
	}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章