數獨遊戲的生成演算法
電腦自動生成數獨遊戲的謎題
要得出所有滿足條件的組合確實不是件容易的事情(主要是很多,列印起來很慢) 。但偶們的目標只是每次能得到一個新的組合,然後從格子裡面隨機遮掉一些數字就可以了。所以只需要在解數獨遊戲演算法的基礎上稍作修改即可。
所以,演算法的步驟是:
1.往第一行或第一列隨機填1-9的數字
2.呼叫解數獨演算法得到一個結果
3.每行隨機遮掉1-8個數字。如果需要較大的難度,也可以將1-8改為2-8或3-8,等等。
以下是console工程的程式碼:
// sudoku.cpp : 定義控制檯應用程式的入口點。
// by superarhow([email protected])
#include "stdafx.h"
#include "conio.h"
/***************** 廣告位招租 *********************/
/* 為了程式碼好看^^ */
#define SUCCESS 1
#define _FAILED 0
/* 地圖型別9*9的char,每個char從0-9,0表示待填 */
typedef char MAPTYPE[9][9];
/* 行資料,同時用作“可能性”資料。如LINETYPE a; 當a[0]為真時表示
當前位置可填1,a[1]為真時表示可填2,以此類推 */
typedef char LINETYPE[9];
typedef void (*ONMAPOKCALLBACK)(MAPTYPE map);
/* 列印地圖 */
void dump_map(MAPTYPE dest)
{
for ( int j = 0; j < 9; j++ )
{
for ( int i = 0; i < 9; i++ )
{
printf("%d ", dest[i][j]);
}
printf("/n");
}
printf("/n");
}
int fill_line(MAPTYPE dest, int line, ONMAPOKCALLBACK callback);
/* 填下一個格子。本行的可能性已在呼叫前算好,要考慮的是列的可能性和九宮格的可能性 */
/* nums_possible : array (0-8) means possible of number (1-9) */
int fill_pos(MAPTYPE dest, LINETYPE nums_possible, int line, int pos, ONMAPOKCALLBACK callback)
{
if ( pos >= 9 )
{
return fill_line(dest, line + 1, callback);
}
if ( dest[pos][line] != 0 ) return fill_pos(dest, nums_possible, line, pos + 1, callback);
for ( int i = 0; i < 9; i++ )
{
if ( !nums_possible[i] ) continue;
/* 檢查本列是否重複 */
int vetical_failed = 0;
for ( int j = 0; j < 9; j++ )
if ( dest[pos][j] == i + 1 )
{
vetical_failed = 1;
break;
}
if ( vetical_failed ) continue;
/* 檢查九宮格是否重複 */
int nine_failed = 0;
int m = pos / 3;
int n = line / 3;
m *= 3;
n *= 3;
for ( int y = n; y < n + 3; y++ )
{
for ( int x = m; x < m + 3; x++ )
{
if ( dest[x][y] == i + 1 )
{
nine_failed = 1;
break;
}
}
if ( nine_failed ) break;
}
if ( nine_failed ) continue;
/* all ok, try next position */
dest[pos][line] = i + 1;
nums_possible[i] = 0;
if ( fill_pos(dest, nums_possible, line, pos + 1, callback) )
{
/* 本行已全部OK,嘗試下一行 */
if ( fill_line(dest, line + 1, callback) ) return SUCCESS;
/* 下一行失敗,重新嘗試本位置的剩餘可能性 */
}
nums_possible[i] = 1;
dest[pos][line] = 0;
}
return _FAILED;
}
/* 填下一行 */
int fill_line(MAPTYPE dest, int line, ONMAPOKCALLBACK callback)
{
if ( line >= 9 )
{
/* copy map */
callback(dest);
return SUCCESS;
}
LINETYPE nums;
LINETYPE saveline;
/* calc possibility(for the current line) */
for ( int i = 0; i < 9; i++ ) nums[i] = 1; /* all can be */
for ( int i = 0; i < 9; i++ )
{
char n = dest[i][line];
/* save line */
saveline[i] = dest[i][line];
if ( n != 0 ) nums[n - 1] = 0; /* appears */
}
if ( !fill_pos(dest, nums, line, 0, callback) )
{
/* restore line */
for ( int i = 0; i < 9; i++ ) dest[i][line] = saveline[i];
return _FAILED;
}
return SUCCESS;
}
MAPTYPE g_result;
void on_map_ok(MAPTYPE map)
{
memcpy(g_result, map, sizeof(MAPTYPE));
}
#include "windows.h"
int _tmain(int argc, _TCHAR* argv[])
{
MAPTYPE dest;
memset(dest, 0, sizeof(MAPTYPE));
srand( GetTickCount() );
/* 隨機填充第一行 */
char ch[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for ( int i = 0; i < 9; i++ )
{
int p = rand() % 9;
char t = ch[p];
ch[p] = ch[i];
ch[i] = t;
}
for ( int i = 0; i < 9; i++ ) dest[i][0] = ch[i];
if ( fill_line(dest, 0, on_map_ok) )
{
/* 修剪掉一些塊 */
for ( int i = 0; i < 9; i++ )
{
/* 調整n的取值範圍可改變難度 %6 + 3是比較難的 */
int n = (rand() % 6) + 3;
for ( int j = 0; j < 9; j++ ) ch[j] = j; /* ch: index to erase */
for ( int j = 0; j < 9; j++ )
{
int p = rand() % 9;
char t = ch[p];
ch[p] = ch[i];
ch[i] = t;
}
for ( int j = 0; j < n; j++ ) g_result[ch[j]][i] = 0;
}
dump_map(g_result);
}
getch();
return 0;
}
相關推薦
數獨的生成演算法和解題演算法
github專案地址:https://github.com/Xcodingman/sudo.git配置環境:windows10 vs2013開啟工程檔案,執行相對應的cpp檔案即可1.數獨解題與出題演算法一、基於遞歸回溯法的數獨解題演算法思路:眾所周知,數獨一般的解法需要用到
數獨遊戲的生成演算法
電腦自動生成數獨遊戲的謎題 要得出所有滿足條件的組合確實不是件容易的事情(主要是很多,列印起來很慢) 。但偶們的目標只是每次能得到一個新的組合,然後從格子裡面隨機遮掉一些數字就可以了。所以只需要在解數獨遊戲演算法的基礎上稍作修改即可。 所以,演算法的步驟是: 1.往第一行或第
1.數獨題目生成程式(搜尋演算法)
前幾天在玩數獨遊戲的時候,產生了一個大膽的想法: 數獨app上的題目都是現成的,乾脆自己寫一個可以隨機生成數獨的程式算了 一、需求提出: 1.隨機生成數獨題目,要求該題目有解; 2.當填數違反數獨操作(填到題目原本的數字去了,填數違規等)時,禁止操作,彈出提示
個人項目-數獨終局生成與解數獨
ima github 數獨 analysis tro AR war per https 1、先給出在這個小項目的開發過程中各個階段的程序及相關文檔 https://github.com/xulink/sudoku; 2、 PSP2.1
數獨遊戲界面功能
mes menu sin cti wro 容器 inf ati nal 根據題目要求,本次采用JAVA添加GUI界面,並根據上次老師點評的要求下對原數獨實現進行一定改進,因此,JAVA源碼如下: 1、GUI界面設計如下 1 package JAVA練習; 2 im
數獨遊戲介面功能
根據題目要求,本次採用JAVA新增GUI介面,並根據上次老師點評的要求下對原數獨實現進行一定改進,因此,JAVA原始碼如下: 1、GUI介面設計如下 1 package JAVA練習; 2 import javax.swing.*; 3 import java.awt.*;
基於第二次作業數獨遊戲,新增GUI介面
基於第二次數獨遊戲,在此基礎上進行新增GUI介面,GUI介面程式碼如下:建立一個ShuduGUI類。 1 package sudoku; 2 import javax.swing.*; 3 import java.awt.*; 4 import java.awt.ev
數獨遊戲的兩種程式設計思路+程式碼
###數獨 方法一: 設定三個方法;分別為行不重複,列不重複,單元格不重複;在判斷是否重複的時候用了一個Boolean陣列,預設值為false,若角標位置為true時那麼說明已經重複了 需求:判斷是否為數獨矩陣 /* 思路:當每行元素不得重複,並且每列元素不得重複,並且每個小方陣也不得
數獨遊戲程序
report 交換 添加 con 出現 事先 誤操作 退出 ont mathe的專欄 http://blog.csdn.net/mathe/article/details/1175498 數獨遊戲程序 分類: 軟件2007-08-23 11:02 22389人閱
數獨終局生成與求解(1)
專案Github地址 https://github.com/Tim-xiaofan/sudoku.git 準備與思考 Visual Studio GitHub程式碼託管配置 廖雪峰的網站有通俗易懂的Git教程 數獨問題 命令列引數的傳遞 (1)控制終
數獨遊戲解法
數獨遊戲解法 深搜(棧實現) 難過的是我時間來不及了,唉... 1 import java.util.*; 2 3 class Point{ 4 int x, y, num; 5 public Point(int x, int y, int
數獨模板生成
在網上找了好多的數獨生成演算法發現一個挺好的演算法,然後自己稍微修改了一下,將其改為數獨模板生成工具,用了為我的數獨app生成模板。 本文中用到的數獨生成演算法從網上借鑑而來,但是記不清是哪個網址了,如果此演算法的原作者看到,請海涵! public class ShuDu { &
深度優先搜尋_之數獨遊戲
1. 問題描述: 你一定聽說過“數獨”遊戲。 如下圖所示,玩家需要根據9×9盤面上的已知數字,推理出所有剩餘空格的數字,並滿足每一行、每一列、每一個同色九宮內的數字均含1-9,不重複。 數獨的答案都是唯一的,所以,多個解也稱為無解。 本圖的數字據說是芬蘭數學家花了3個月的時
go例子(二) 使用go語言實現數獨遊戲
例子託管於github example.go package main import ( "./sudoku" ) func main() { &nbs
20. 帶旋轉的數獨遊戲
Description 數獨是一個基於邏輯的組合數字放置拼圖,在世界各地都很受歡迎。 在這個問題上,讓我們關注 #include <vector> #include <cstdio>// #include <algorithm> #includ
Java 數獨遊戲程式碼
import java.awt.*; import java.awt.event.*; import java.io.*; import javax.swing.*; import java.uti
python和java實現數獨遊戲
使用python和java實現數獨遊戲,有比較才有收穫哦 1、Python版 #--coding:utf-8-- import random import itertools from copy import deepcopy def make_board(m=3):
【DFS】數獨遊戲
=== 技術分享 lean bsp 分享 new 所有 探索 imp DFS(深度優先搜索): 深度優先搜索算法(英語:Depth-First-Search,簡稱DFS)是一種用於遍歷或搜索樹或圖的算法。 沿著樹的深度遍歷樹的節點,盡可能深的搜索樹的分支。當節點v的所
React-native數獨遊戲(一)數獨生成與校驗
react-native還是蠻火的,前面用它做了一個火車票查詢的,感覺還可以,繼續研究,寫了這個數獨小遊戲,和大家分享一下。 github原始碼地址 第一部分是關於數獨生成的部分,數獨規則很簡單,行列都沒有重複,每個九宮格也不能重複,演算法也是依照此規則
Codewars 打怪日記 5星級kyu 數獨遊戲 我是否完成了陣列 Did I Finish my Sudoku? 看小菜和大神迴圈的巧妙運用
史蒂夫·喬布斯說過,每個人都應該學習給電腦編寫程式的技術,因為這一過程能夠教你如何去思考!學習程式設計的渠道有很多種,比如你可以利用一些互動平臺或者書籍去學習程式設計,無論是哪種,只要找到適合自己的就OK。程式設計極富有創造性,你可以創造出許多新奇有趣的想法。很多時候,開發