蓝桥杯-方格填数
方格填數
如下的10個格子
+–+–+–+
| | | |
+–+–+–+–+
| | | | |
+–+–+–+–+
| | | |
+–+–+–+
(如果顯示有問題,也可以參看【圖1.jpg】)
填入0~9的數字。要求:連續的兩個數字不能相鄰。
(左右、上下、對角都算相鄰)
一共有多少種可能的填數方案?
請填寫表示方案數目的整數。
注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。
一開始直接用dfs八個方向進行搜索,結果很大,也不知道問題在哪里
最后直接一個方格一個方格的填,就出現了答案
先說一下思路吧, 對于每一個0-9的數進行標記,對于每一個坐標點進行填數
對填寫的數進行判斷如果可以直接填寫,然后進行下一個dfs
如果不可以進行尋找合適的數字,找不到直接回溯到上一個dfs
答案:1580
java代碼實現:
朋友做的代碼效率比我高出N倍…:
自己代碼(58000ms,呵呵。。。):
package com.tjrac_java_2;public class SumCount {//考慮到邊界問題把數組行列擴大兩位static int count=0, sum = 0;//count表示已經填充數的字格數。sum表示最后輸出結果static int[][] go = {{0,1},{1,0},{0,-1},{1,-1},{-1,0},{-1,1},{-1,-1},{1,1}};//右、下、左、左下、上、右上、左上、右下static int[][] newGo={{-1,0},{1,0},{0,-1},{0,1}};static int[] num = new int[10];//用來判斷該數字是否用過,用過為1 否則為0static int[] road = new int[11];static int flag=0;static long start , end;public static void main(String[] args) {start = System.currentTimeMillis();int [][] a = new int [5][6];for (int i = 0; i < 10; i++) {num[i]=0;}for(int i=0;i<5;i++){for(int j=0;j<6;j++){a[i][j]=11;//表示可以訪問,之所以為11因為方便判斷不相鄰}}for(int i=0;i<10;i++){a[1][2]=i;//控制第一個方格的值num[i]=1;//標記i不能再用了count++;flag=i;//road[i]=12;//路徑DFS(a,1,2);a[1][2]=11;num[i]=0;count--;}System.out.println("總次數:"+sum);System.out.println("用時:"+(System.currentTimeMillis()-start)); // for (int is : road) { // System.out.println(is); // }}private static void DFS(int[][] a, int x, int y) {//遞歸出口//表示10個數字填充完畢System.out.println("ok");if(count == 10 ){sum++;return ;}else{//for(int i = 0; i < 8; i ++){for(int i = 0; i < 4; i++){//往相鄰方格填數字int xx = x + go[i][0];int yy = y + go[i][1];//判斷邊界,是否已經填充了數字,滿足相鄰不為1if((xx==1&&yy==1) || (xx==3&&yy==4))continue;//因為11和44不能訪問if(xx >= 1 && xx <= 3 && yy >= 1 && yy <= 4 && a[xx][yy] ==11 ){//往該方格中放數字System.out.println("上個方格:"+"x:"+x+"->>y:"+y);System.out.println("現在方格:"+"xx: "+xx+" yy: "+yy);for( int k = 0; k < 10; k++){//判斷該數字是否被用過,并且數字不相鄰if(num[k] == 0 && Math.abs(k-a[xx][yy+1])!=1 && Math.abs(k-a[xx+1][yy])!=1 && Math.abs(k-a[xx][yy-1])!=1 && Math.abs(k-a[xx+1][yy-1])!=1 &&Math.abs(k-a[xx-1][yy])!=1&& Math.abs(k-a[xx-1][yy+1])!=1 &&Math.abs(k-a[xx-1][yy-1])!=1&& Math.abs(k-a[xx+1][yy+1])!=1){a[xx][yy] = k;System.out.println("填入數字:"+"xx: "+xx+" "+yy+" 數字:"+k+"右邊:"+a[xx][yy-1]);num[k]=1;count++;//road[count]=xx*10+yy;DFS(a,xx,yy);a[xx][yy] = 11;num[k]=0;count--;System.out.println("填入的方格總數:"+count);/* if(count<0){return;}*/}}}}//}}} }總結
- 上一篇: C++ STL--stack/queue
- 下一篇: C链表(顺序表、静态链表区别)