日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

蓝桥杯-方格填数

發布時間:2024/8/23 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 蓝桥杯-方格填数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

方格填數

如下的10個格子
+–+–+–+
| | | |
+–+–+–+–+
| | | | |
+–+–+–+–+
| | | |
+–+–+–+

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

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

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

請填寫表示方案數目的整數。
注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。

一開始直接用dfs八個方向進行搜索,結果很大,也不知道問題在哪里
最后直接一個方格一個方格的填,就出現了答案
先說一下思路吧, 對于每一個0-9的數進行標記,對于每一個坐標點進行填數
對填寫的數進行判斷如果可以直接填寫,然后進行下一個dfs
如果不可以進行尋找合適的數字,找不到直接回溯到上一個dfs

答案:1580
java代碼實現:
朋友做的代碼效率比我高出N倍…:

package com.tjrac_java_2;public class QuanPaiLie {static int all=0;static int[] num={-2,-2,-2,-2,-2,-2,-2,-2,10,10,10,-2,-2,10,10,10,10,-2,-2,10,10,10,-2,-2,-2,-2,-2,-2,-2,-2,};static int []useful={8,9,10,13,14,15,16,19,20,21};static int check(int i)//該位置方格的上,左,左上,右上{ if(num[i]==num[i-1]-1||num[i]==num[i-1]+1)return 0;else if(num[i]==num[i-6]-1||num[i]==num[i-6]+1)return 0;else if(num[i]==num[i-7]-1||num[i]==num[i-7]+1)return 0;else if(num[i]==num[i-5]-1||num[i]==num[i-5]+1)return 0;elsereturn 1;}static int check_same(int i)//判斷該方格中的數字是否被用過{for(int j=0;j<i;++j)if(num[useful[j]]==num[useful[i]])return 0;return 1;}static void func(int round){if(round>9)//如果round>9表示已經給所有方格添加數字{ ++all;return ;}elsefor(int i=0;i<=9;++i){num[useful[round]]=i;//數字添加到方格中if(check_same(round)==1&&check(useful[round])==1)//判斷該方格數字是否已經用過,以及該填充的方格數字滿足相鄰不為1func(round+1);//遞歸遍歷下一個方格}}public static void main(String[] args) {func(0);System.out.println(all);} }

自己代碼(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;}*/}}}}//}}} }

總結

以上是生活随笔為你收集整理的蓝桥杯-方格填数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。