---------------------------------------- .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只能有乙個工...