Sudoku DLX演算法求解

2021-09-30 04:44:31 字數 2225 閱讀 7865

---------------------------------------- .h

#ifndef _dlx_sudoku_h_

#define _dlx_sudoku_h_

#include

using namespace std;

#define rr      729             // 81 * 9

#define cc      324             // 81 * 4

struct node

;// dlx 演算法求數獨的解

class cdlxsudoku

inline void remove(int c)}}

inline void resume(int c)

}   

m_col[c].left->right=&m_col[c];

m_col[c].right->left=&m_col[c];

}int serch(int k);

bool m_bchkunique;  // 做解是否唯一的校驗

char m_ch[81];      // 輸入字元,已經轉換為(0-9)

node m_head;

node m_all[rr*4];

node m_row[rr];

node m_col[cc];

int  m_cnt[cc];

int  m_mem[81];     // 儲存選擇的行號

int  m_rslt[81];    // 儲存解中選擇的行號

int  m_ans[81];     // 答案 9*9

int  m_all_t;       // m_all 中使用元素的下標

};#endif  // _dlx_sudoku_h_

// -----------------------------------------.cpp

cdlxsudoku::cdlxsudoku(bool bchkunique /*= true*/)

int cdlxsudoku::serch(int k)

node*t,*tt;

int min=rr+1;   // 每列的元素個數不會超過 rr

int tc;

for(t=m_head.right;t!=&m_head;t=t->right)

}remove(tc);

int scnt = 0;

for(t=m_col[tc].down;t!=&m_col[tc];t=t->down)

scnt += serch(k+1);

// 不檢測唯一性且解為1 或者 檢測唯一性時解大於1

if (!m_bchkunique && scnt==1 || scnt>1)

return scnt;

for(tt=t->left;tt!=t;tt=tt->left)

}resume(tc);

return scnt;

}int cdlxsudoku::solve(string & strsudoku)

++i;

}m_all_t=0;

memset(m_cnt,0,sizeof(m_cnt));

m_head.left=&m_head;

m_head.right=&m_head;

m_head.up=&m_head;

m_head.down=&m_head;

m_head.r=rr;

m_head.c=cc;

for(i=0;iright=&m_col[i];

m_col[i].right->left=&m_col[i];

}for(i=0;idown=&m_row[i];

m_row[i].down->up=&m_row[i];

}for(i=0;iright=m_row[i].right;

m_row[i].right->left=m_row[i].left;

}int num=serch(0);

// printf("num=%d/n",num);

int k;

for(i=0;i<81;i++)

//    for(i=0;i<81;i++)

//        printf("%d",m_ans[i]);

//    printf("/n");

//    printfsolve();

return num;

}

A 演算法求解迷宮

cpp view plaincopy include include include using namespace std 方向向量 int direc 4 2 封閉,開放列表標記 enum flag 最小堆節點類 堆優先順序為 f g h g為當前的路徑長 h為估計當前位置到目標位置開銷探測 當...

Sparse Table演算法 求解RMQ

sparse table演算法,簡稱st演算法,可以用來求解rmq 區間最值查詢 問題。rmq問題的形式一般是 存在乙個大陣列,要求對於給定的起點和終點,迅速回答出這段區間的最大值或最小值。樸素的方式是掃瞄起點到終點的所有數,維護其中的最值,這樣的複雜度是o n 2 的,速度太慢。st演算法是使用的...

《演算法》蛇形矩陣求解

蛇形矩陣 右下,下左,左上,上右,迴圈往復 如果每次迴圈都計算x,y當前的極限值會很耗費效能,不如讓x和y直接越界,當越界的點不存在時,再回退一步,並按照 對方 上次的極限值 最大或最小 去確定 正確的轉向方向 左或右 import time import sys x變化或y變化 x和y只能有乙個工...