生活随笔
收集整理的這篇文章主要介紹了
构造数独 算法及代码实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
子標題: 編程之美1.15——構造數獨?
轉載信息:?http://blog.csdn.net/linyunzju/article/details/7673959
?
問題:
構造一個9*9的方格矩陣,玩家要在每個方格中,分別填上1至9的任意一個數字,
讓整個棋盤每一列、每一行以及每一個3*3的小矩陣中的數字都不重復。
?
首先我們通過一個深度優先搜索來生成一個可行解,然后隨機刪除一定數量的數字,
以生成一個數獨。
?
#include<iostream> ?#include<cstdlib> ?usingnamespace std; ?? #define LEN 9 ?#define CLEAR(a) memset((a),0,sizeof(a)) ?? int level[]={30,37,45}; ?? int grid[LEN+1][LEN+1]; ?int value[LEN+1]; ?? voidnext(int&x,int&y) ?{ ?? ? x++; ?? ? if(x>9) ?? ? { ?? ? ? ? x =1; ?? ? ? ? y++; ?? ? } ?} ?? // 選擇下一個有效狀態 ?int pickNextValidValue(int x,int y,int cur) ?{ ?? ? CLEAR(value); ?? ? int i, j; ?? ? for(i=1; i<y; i++) ?? ? ? ? value[grid[i][x]]=1; ?? ? for(j=1; j<x; j++) ?? ? ? ? value[grid[y][j]]=1; ?? ? int u =(x-1)/3*3+1; ?? ? int v =(y-1)/3*3+1; ?? ? for(i=v; i<v+3; i++) ?? ? ? ? for(j=u; j<u+3; j++) ?? ? ? ? { ?? ? ? ? ? ? value[grid[i][j]]=1; ?? ? ? ? } ?? ? for(i=cur+1; i<=LEN && value[i]; i++); ?? ? return i; ?} ?? void pre(int&x,int&y) ?{ ?? ? x--; ?? ? if(x<1) ?? ? { ?? ? ? ? x =9; ?? ? ? ? y--; ?? ? } ?} ?? int times =0; ?? int main() ?{ ?? ? int x, y, i, j; ?? ? x = y =1; ?? ? // 深度搜索的迭代算法 ?? ? while(true) ?? ? { ?? ? ? ? times++; ?? ? ? ? // 滿足成功結果 ?? ? ? ? if(y==LEN && x==LEN) ?? ? ? ? { ?? ? ? ? ? ? for(i=1; i<=LEN; i++) ?? ? ? ? ? ? { ?? ? ? ? ? ? ? ? for(j=1; j<=LEN; j++) ?? ? ? ? ? ? ? ? ? ? cout << grid[i][j]<<" "; ?? ? ? ? ? ? ? ? cout << endl; ?? ? ? ? ? ? } ?? ? ? ? ? ? cout << times << endl; ?? ? ? ? ? ? break; ?? ? ? ? ? ? //pre(x, y); ?? ? ? ? ? ? //times = 0; ?? ? ? ? } ?? ? ? ? // 滿足失敗結果 ?? ? ? ? if(y==0) ?? ? ? ? ? ? break; ?? ? ? ? // 改變狀態 ?? ? ? ? grid[y][x]= pickNextValidValue(x, y, grid[y][x]); ?? ? ? ? if(grid[y][x]> LEN) ?? ? ? ? { ?? ? ? ? ? ? // 恢復狀態 ?? ? ? ? ? ? grid[y][x]=0; ?? ? ? ? ? ? pre(x, y); ?? ? ? ? } ?? ? ? ? else ?? ? ? ? ? ? // 進一步搜索 ?? ? ? ? ? ? next(x,y); ?? ? } ?? ? for(i=1; i<= level[2]; i++) ?? ? { ?? ? ? ? int ind = rand()%(LEN*LEN); ?? ? ? ? grid[ind/LEN+1][ind%LEN]=0; ?? ? } ?? ? for(i=1; i<=LEN; i++) ?? ? { ?? ? ? ? for(j=1; j<=LEN; j++) ?? ? ? ? ? ? cout << grid[i][j]<<" "; ?? ? ? ? cout << endl; ?? ? } ?} ?
轉載于:https://www.cnblogs.com/mfryf/archive/2012/08/11/2633746.html
總結
以上是生活随笔為你收集整理的构造数独 算法及代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。