4.數獨題目生成程序2.0(保證唯一解) - 台部落

文章推薦指數: 80 %
投票人數:10人

看到程序解起數獨題來快得一批,又想起數獨遊戲初代目無法生成唯一解時,一個大膽的想法逐漸在腦海裏浮現起來: 生成終盤(標準答案) ... 題目生成器. 請輸入正確的登錄賬號或密碼 註冊 忘記密碼 首頁 遊戲 正文 4.數獨題目生成程序2.0(保證唯一解) 原創 我已经是条咸鱼了 2019-04-0616:56 在做藍橋杯練習的時候又遇到了求數獨解的題目。

看到程序解起數獨題來快得一批,又想起數獨遊戲初代目無法生成唯一解時,一個大膽的想法逐漸在腦海裏浮現起來: 生成終盤(標準答案)後隨機挖上N個洞做成的數獨題肯定不能保證解唯一, 我把這個數獨題給程序解答,讓它求出所有答案(反正快得一批), 再拿這些答案和標準答案對比, 哪些地方不一樣(以下稱爲刺頭),我不挖那些地方不就行了嗎?!   拍大腿,靠,當初怎麼沒想到! 寫完後驗證了一波,解還真唯一了! 雖然還是隨機無腦挖,但比起第一代還是有進步了。

  這個算法還有點缺陷:不能挖太多空,因爲刺頭都被填上了。

其實不必這樣做,因爲有的地方確定了,其他也能確定下來。

可以做如下改進(沒有實現): ①如果程序有多個解的話,只求前兩個。

由於用DFS來解數獨,所以第一個求出的答案和標準答案一樣(可以去驗證) ②對比第一個和第二個答案不一樣的地方。

不一樣的地方不挖(將數獨題目挖空的地方填回去),生成新數獨題目。

不必填完所有不一樣的地方!每次可以只填回1個(出於效率也可以多個) 原數獨題目第一個解(標準答案)第二個解 c1c2c3c1c2c3c1c2c3 r1000r1146r1246 r2093r2793r2793 r3050r3852r3851 可以看出,第一,二個解中(c1,r1)及(c3,r3)不一樣,將(c1,r1)或(c3,r3)填回去即可 即: 新數獨題目(不挖(c1,r1)): c1c2c3 r1100 r2093 r3050 ③對於新數獨題目重複以上操作,直到數獨題目只有一解 反正解起題目快得一批~   題目生成器 只是粗略寫了一下,只能生成題目,還沒做界面之類的東西,有空再把坑填完。

importjava.awt.Color; importjava.util.Random; importjavax.swing.BorderFactory; importjavax.swing.JFrame; importjavax.swing.JLabel; /*生成隨機數獨 *流程: *1.生成9*9空白數獨數組 *2.隨機往數獨數組填數 *3.DFS生成數獨標準解(即數獨數組81個格子都填滿數字) *4.先挖n個空,對挖完空的數獨進行求解(全部) *5.將所有解與標準解進行對比,將不一樣的地方記錄下。

這些地方不允許被被挖空 */ classMakeSDK{ privateint[][]Arr;//臨時數組 privateint[][]Sudoku; privateint[][]Answer;//答案 privateint[][]Game; publicMakeSDK(){ this.Arr=newint[9][9]; this.Sudoku=newint[9][9]; this.Answer=newint[9][9]; rand(); DFS(Arr,0,false); diger(); } privatevoidrand(){ intt=0; intx,y,num; //先往數組裏面隨機丟t個數 while(t<15){//t不宜多,否則運行起來耗費時間;t也不宜少,否則生成的遊戲看起來一點也不隨機 x=newRandom().nextInt(9); y=newRandom().nextInt(9); num=newRandom().nextInt(9)+1; if(Arr[y][x]==0){ if(isTrue(Arr,x,y,num)==true){ Arr[y][x]=num;++t; } } } } //判斷該數字填寫的地方是否符合數獨規則 privatebooleanisTrue(intarr[][],intx,inty,intnum){//數字橫座標;數字縱座標;數字數值 //判斷中單元格(3*3) for(inti=(y/3)*3;i0){ intx=newRandom().nextInt(9); inty=newRandom().nextInt(9); if(Sudoku[y][x]!=0){ Sudoku[y][x]=0;--t; } } for(inti=0;i<9;++i){ for(intj=0;j<9;++j){ Game[i][j]=Sudoku[i][j]; } } DFS(Sudoku,0,true); } //獲取最終數獨 publicint[][]getArr(){ returnthis.Game; } //獲取數獨答案 publicint[][]getAnswer(){ returnthis.Answer; } } //遊戲界面 classUI{ privateJFrameGameUI; privateJLabelBigGrid;//大格子(9*9) privateJLabelMidGrid[];//中格子(3*3) privateJLabelSmaGrid;//小格子(1*1) publicUI(){ GameUI=newJFrame(); GameUI.setVisible(true); GameUI.setLayout(null); GameUI.setSize(400,330); //大格子 BigGrid=newJLabel(); BigGrid.setBorder(BorderFactory.createLineBorder(Color.black)); BigGrid.setBounds(10,10,270,270); GameUI.add(BigGrid); MidGrid=newJLabel[9]; inth=0; for(inti=0;i<3;++i){ for(intj=0;j<3;++j){ MidGrid[h]=newJLabel(); MidGrid[h].setBorder(BorderFactory.createMatteBorder(1,0,1,1,Color.BLACK)); MidGrid[h].setBounds(i*90,j*90,90,90); BigGrid.add(MidGrid[h]); ++h; } } } } publicclassMain{ //測試方法 publicstaticvoidmain(Stringarg[]){ MakeSDKgame=newMakeSDK(); //newUI(); // for(inti=0;i<9;++i){ // if(i%3==0&&i!=0){ // System.out.print("\n------------------------"); // } // System.out.println(); // for(intj=0;j<9;++j){ // if(j%3==0){ // System.out.print("|"); // } // System.out.print(game.getArr()[i][j]+""); // } // } System.out.println("生成題目:"); for(inti=0;i<9;++i){ for(inth=0;h<9;++h){ System.out.print(game.getArr()[i][h]); } System.out.println(); } } }   解數獨器: #include #include #include #include #include inta[9][9],total; intbfs(intx,inty,intnum){ intm,n,time=0; intdir[9][2]={{1,1},{1,0},{1,-1},{0,1},{0,-1},{-1,1},{-1,0},{-1,-1},{0,0}}; for(inti=0;i<9;++i){ m=x+dir[i][0],n=y+dir[i][1]; if(num==a[n][m]){ ++time; } if(time>1){ return0; } } return1; } intjudge(intx,inty,intn){ intt=0; for(inti=0;i<9;++i){ if(a[y][i]==n){ ++t; if(t>1){ return1; } } } t=0; for(inti1=0;i1<9;++i1){ if(a[i1][x]==n){ ++t; if(t>1){ return1; } } } intnu,m; if(bfs(1+(x/3)*3,1+(y/3)*3,n)==0){ return1; } return0; } voidsel(intx,inty){ if(y<9){ if(x<9){ if(a[y][x]==0){ for(inti=1;i<=9;++i){ a[y][x]=i; if(judge(x,y,i)==0){ sel(x+1,y); } a[y][x]=0; } }else{ sel(x+1,y); } }else{ sel(0,y+1); } }else{ ++total; printf("\n\n"); for(inti=0;i<9;++i){ for(intj=0;j<9;++j){ printf("%d",a[i][j]); } printf("\n"); } } } intmain(){ printf("輸入格式:\n"); printf("005300000\n800000020\n070010500\n400005300\n010070006\n003200080\n060500009\n004000030\n000009700\n"); printf("\n\n請輸入數獨題:\n"); for(inti=0;i<9;++i){ intline; scanf("%d",&line); for(intj=0;j<9;++j){ a[i][8-j]=line%10; line/=10; } } sel(0,0); Sleep(100000); return0; }   發表評論 登录 所有評論 還沒有人評論,想成為第一個評論的人麼?請在上方評論欄輸入並且點擊發布. 相關文章 Python實現經典小遊戲貪食蛇-趣玩Python系列三 前言: 上一篇已採用pygame做了一個Python實現黑客帝國代碼雨-趣玩Python系列二的效果,今天升級一下,來實現一個經典小遊戲-貪食蛇吧。

首先我們需要導入待使用的模塊: importpygame,sys,random 明哥看世界 2020-07-0805:11:00 U3D菜單中文註解 File   文件: ----NewScene   新場景 ----OpenScene   打開場景 ----SaveScene   保存場景 ----SaveSceneas   另存爲 ----NewProject 禾子续 2020-07-0807:48:55 【U3D/簡單框架】6.UI模塊 自我介紹 廣東雙非一本的大三小白,計科專業,想在製作畢設前夯實基礎,畢設做出一款屬於自己的遊戲! UI模塊 UI基類BasePanel.cs,以後子類只需要繼承這個基類,使用如圖 一定一定一定要注意泛型的約束whereT: 神经大爆炸 2020-07-0807:23:31 功能簡單的吞喫蛇(shell編程)  天老師叫我們做了個吞喫蛇,只實現了很簡單的功能,不廢話,上馬:     #!/bin/bash trapinput_key=020 trapinput_key=121 trapinput_key=222 trapinput z0203153008 2020-07-0806:36:40 程序員中的奇葩,使用php構建魔獸世界   這是用PHP編寫的魔獸世界服務器。

現在它已經調試了登錄服務器的過程。

目前的魔獸世界客戶端是2.4.3_8606。

服務器列表和帳戶密碼數據需要查詢AUTH庫。

世界服務器身份驗證過程已完成,數據包加密已完成後續進程正在開發 明哥看世界 2020-07-0805:11:00 《甩了,甩了,甩了他》----轉   美國情感作家葛瑞哥在他的新書《甩了,甩了,甩了他》裏寫道,停止悲傷吧,一個假裝在人間蒸發的男人沒那麼值得懷念。

你就當他死了。

 你沉迷的不是愛情, cubijing 2020-07-0803:32:42 GTA5全自動線上網絡優化器,解決上線困難、切換困難![MCGC]GTA5網絡優化器GTA5網絡優化_MCGC [MCGC]GrandTheftAutoV網絡優化器寫在前面■■■下載地址■■■■■■使用必看圖文說明,共6條■■■■■■線上多人注意事項及網絡設置方法■■■■1.GTA內,HOME鍵-設置,裏面網絡狀態NA MCG贴吧吧主团子喵 2020-07-0800:59:28 Android遊戲開發之繪畫旋轉的物體(Matrix類的邏輯異常) Android遊戲開發中可能有一些旋轉的物體:例如旋轉的地球,花朵,齒輪等零部件,或者背景,甚至承載重要邏輯的對象。

如果由像素點構成,邏輯變化,當然是一種思路,但是這樣很難有很好的視覺效果,還牽扯到重要的底層算法的實現。

但是如果想讓一 zy19980116 2020-07-0800:56:41 真的好辛苦 資料那麼少錯誤那麼多基礎那麼差網速那麼慢登陸那麼慢遊戲那麼脆弱你丫的就不能不崩潰麼你知道登陸一次要花多長時間麼我日你奶奶的   22:15    invoke GetDlgItem,hWnd1,1             huangjunfengok 2020-07-0800:23:43 以前用java寫的貪喫蛇遊戲   /* *遊戲的主畫布類 */importjavax.swing.*;importjava.awt.*;publicclassGameCanvasextendsJPanel{ privateintrows=30, lsrj 2020-07-0720:12:14 AgoBot殭屍網絡研究筆記(十五) 十五、2008年04月09日   作者:青青子衿 email:[email protected] 1、CCDKeyGrab的作用是處理cdkey.get消息, 功能是獲取被控端,下述遊戲的cdkey的值 遊戲列表: (1)、Hal anzijin 2020-07-0717:54:06 09.2.5 因爲無法忍受冠捷液晶電視一個星期左右才能到貨的等待,我早上殺至中關村選電視。

先看帶TV功能的液晶顯示器,這類產品比較少且價格不低。

看中三星的一款和LG的一款,價格差不多都1700多,感覺三星的2232MW外觀非常漂亮功能也很強大,可是價格 crespo5454 2020-07-0717:44:00 Cocos2d-x與ISO內存管理 一,IOS與圖片內存 在IOS上,圖片會被自動縮放到2的N次方大小。

比如一張1024*1025的圖片,佔用的內存與一張1024*2048的圖片是一致的。

圖片佔用內存大小的計算的公式是;長*寬*4。

這樣一張512*512佔用的內存就是 游戏码头 2020-07-0714:14:08 這個社會最大的現實是“大魚喫小魚,小魚喫蝦米”     認真看到最後的人,纔是勇者和朋友。

呵呵……         今天看英語有點想睡,給了自己兩巴掌還是想睡。

於是我到處亂看,無意中在360軟 欢乐雅子 2020-07-0712:53:12 大學畢業生們的25種經典總結 1、大學仍在,只是我在飛逝,畢業後站在校門口一看,才知道熟悉也可以變成一種模糊地映像 2、以前吧也曾以爲大學吧就是用青春來追夢的過程,畢業了才知道我的青春沒了,夢早就沒了 3、人生最可怕的就是理想迷失了方向,可是我卻連理想都沒有 4、 gzdqdb 2020-07-0710:47:14 我 我已经是条咸鱼了 24小時熱門文章 最新文章 2.分治法求解棋盤問題 KMP算法 1.分治法求最大子序和 4.數獨題目生成程序2.0(保證唯一解) 第十屆藍橋杯C/C++B組省賽 最新評論文章 機械手相機9點座標標定-基於C#+EmguCV 台北/板橋/學/生/賴fb852台中上/門/服/務/高雄小/模/高/檔/茶 台北/板橋/學/生/賴fb852台中上/門/服/務/高雄小/模/高/檔/茶 台北/板橋/學/生/賴fb852台中上/門/服/務/高雄小/模/高/檔/茶 台灣本土吃魚喝茶加小番茄賴fb852喝茶覓小姐羅莉學生咩高雄妹技?平价好喝碗電報:sm20290大台北嫖娼林口龜山淫淫正妹思春看照選妹頻道: t.me/linesm20290 台灣本土吃魚喝茶加小番茄賴fb852喝茶覓小姐羅莉學生咩高雄妹技?平价好喝碗電報:sm20290大台北嫖娼林口龜山淫淫正妹思春看照選妹頻道: t.me/linesm20290 台北/板橋/學/生/賴fb852台中上/門/服/務/高雄小/模/高/檔/茶 台灣本土吃魚喝茶加小番茄賴fb852喝茶覓小姐羅莉學生咩高雄妹技?平价好喝碗電報:sm20290大台北嫖娼林口龜山淫淫正妹



請為這篇文章評分?