1.數獨題目生成程式(搜尋演算法)
文章推薦指數: 80 %
得到這個矩陣後,經過簡單的隨機挖空,一道數獨題目就隨機生成了。 0&&board[j][i]<10){
a[r]=board[j][i];++r;
}
}
}
for(inti=0;i<9;++i){
for(intj=i+1;j<9;++j){
if(a[i]==a[j]&&i!=j&&a[i]!=0){
returnfalse;
}
}
}
returntrue;
}
voidSudoku(intboard[9][9]){
time_tseed;
srand(time(&seed));
intnumber=15,p=0,q=0,i=0;
while(i
ps:我把這些隨機生成的題目塞回解數獨器求解,發現解法並不唯一,若要解法唯一則效率 ...
程式人生>>1.數獨題目生成程式(搜尋演算法)
1.數獨題目生成程式(搜尋演算法)
阿新••發佈:2019-02-16
前幾天在玩數獨遊戲的時候,產生了一個大膽的想法:
數獨app上的題目都是現成的,乾脆自己寫一個可以隨機生成數獨的程式算了
一、需求提出:
1.隨機生成數獨題目,要求該題目有解;
2.當填數違反數獨操作(填到題目原本的數字去了,填數違規等)時,禁止操作,彈出提示;
3.當81格都填滿時,判斷對錯;
二、需求分析
總:
需求2,3相對簡單,尤其是需求3,都禁止違規操作了,填滿81格不就贏了嗎?也許是當初沒有給自己再次組織語言的機會,提出了這麼傻缺的需求,核心問題就是需求1。
需求1
首先得到一個9*9,符合數獨規則的矩陣,然後隨機挖空不就行了嗎?所以需求1的問題轉化為如何得到一個隨機9*9數獨矩陣。
第一個想出來的方法是用搜索演算法,在每一個格子隨機生成1-9的數字,然後判斷符不符合規則,再下一個。
這個演算法的缺點是效率感人,81個格子,每個格子的數字都要判斷,每個格子的數字還都是隨機生成的,效率能不感人嗎?
優點是還沒付諸行動就被否定了,給程式編寫省下了不少時間
第二個想法就相對可靠了,先在隨機在若干個格子上生成隨機數(這些隨機數也要符合數獨規則),這樣就變成了一道題目,然後讓電腦用搜索演算法求解,只要能解出一種,就停止解題,並且選取這種解答作為隨機9*9數獨矩陣以及本題的答案。
解不出也沒有關係重新生成隨機數再重新解過就得了。
這個方法可行度很高,優點很多,其中最重要的優點是我在刷藍橋杯時曾經寫過一個解數獨的程式
經過除錯,我把隨機數個數設定在了15,既不會因為太少而使得隨機數在矩陣上分佈不均勻,又保證不會因為數字太多,答案太少而影響生成效率。
得到這個矩陣後,經過簡單的隨機挖空,一道數獨題目就隨機生成了。
ps:我把這些隨機生成的題目塞回解數獨器求解,發現解法並不唯一,若要解法唯一則效率低下。
在除錯後把挖空個數控制在了46~51個。
使得挖空不會太少,影響遊戲性;挖空不會太多,讓題目有成千上萬種解
經過n(n>=30)次測試,在挖空46個的情況下,求解法個數m
1
}//游標控制模組
voidcolor(intb){
HANDLEhConsole=GetStdHandle((STD_OUTPUT_HANDLE));
SetConsoleTextAttribute(hConsole,b);//顏色控制
}//顏色控制模組
voidBoundary(){
gotoxy(3,1);
color(big);
printf("+---+---+---+---+---+---+---+---+---+");
color(small);
for(inti=1;i<10;++i){
color(small);
gotoxy(3,i*2+1);
if(i==3||i==6){
color(mid);
}
printf("+---+---+---+---+---+---+---+---+---+");
for(intj=0;j<10;++j){
gotoxy(3+j*4,i*2);
if(j==3||j==6){
color(mid);
}
if(j==0||j==9){
color(big);
}
printf("|");
color(7);
gotoxy(3+j*4,i*2+1);
if(i%3!=0||j%3!=0){
color(small);
}
if(j==0||j==9){
color(big);
}
if((i%3==0||j%3==0)&&j!=0&&j!=9){
color(mid);
}
printf("+");
color(small);
}
}
color(big);
gotoxy(3,19);
printf("+---+---+---+---+---+---+---+---+---+");
color(7);
gotoxy(60,1);
printf("數獨遊戲");
gotoxy(45,3);
printf("哈蒙森軟體工業公司1875年出品");
gotoxy(45,5);
printf("解法:0種");
gotoxy(45,7);
printf("操作中輸入'678',表示對6行8列標記為8;輸入'999'表示放棄遊戲");
for(inti=0;i<9;++i){
gotoxy(4*i+5,0);
printf("%d",i);
gotoxy(4*i+5,20);
printf("%d",i);
gotoxy(1,2*i+2);
printf("%d",i);
gotoxy(41,2*i+2);
printf("%d",i);
}
}
boolFlag(intm,intn,intb,intboard[9][9]){
inta[9];
for(inti=0;i<9;++i){
if(board[i][m]==b){
returnfalse;
}
if(board[n][i]==b){
returnfalse;
}
}
for(inti=0;i<9;++i){
a[i]=0;
}
a[0]=b;
gotoxy(50,15);
intq=(n/3)*3,p=(m/3)*3,r=1;
for(inti=p;i
延伸文章資訊
- 1数独解算器
数独解算器. 如果您在某个数独游戏上思考了很长时间无果,不要过早放弃,继续尝试- 独立完成游戏的感觉是值得花时间的。然而,如果反复尝试后一直失败,可使用此解算 ...
- 2數獨解題機解答機Sudoku Solver | Shareweblink - 賽馬會賠率 ...
English / 日本語. 數獨解題機. 請輸入已知的數字在以下的方格裡. NEW馬會足球賠率關注網. 1, 2, 3, 4, 5, 6, 7, 8, 9. 1. 2. 3. 4. 5. 6....
- 3数独生成器_在线数独题目生成工具 - fly63前端网
数独生成器,一款数独在线生成工具,可以在线免费玩数独。5个难度级别,无限量随机数独谜题生成,还可以打印出来哦。 数独. 数独是一种风靡全球的智力游戏,也称 ...
- 4數獨解算器 - Sudoku.Name
數獨解算器让您能够输入来自报纸或其它网站的數獨迷题,然后获得正确解答。
- 5解算器- 在線玩數獨謎
數獨解算器. 數獨決定工具允許你輸入任何你想要的有效的數獨網格,或者只是想檢查你的答案是否 ...