【POJ】3076 Sudoku
2015-11-18 16:18
369 查看
DLX第一题,模板留念。
/* 3076 */ #include <iostream> #include <string> #include <map> #include <queue> #include <set> #include <stack> #include <vector> #include <deque> #include <algorithm> #include <cstdio> #include <cmath> #include <ctime> #include <cstring> #include <climits> #include <cctype> #include <cassert> #include <functional> #include <iterator> #include <iomanip> using namespace std; //#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int> #define stpii set<pair<int, int> > #define mpii map<int,int> #define vi vector<int> #define pii pair<int,int> #define vpii vector<pair<int,int> > #define rep(i, a, n) for (int i=a;i<n;++i) #define per(i, a, n) for (int i=n-1;i>=a;--i) #define clr clear #define pb push_back #define mp make_pair #define fir first #define sec second #define all(x) (x).begin(),(x).end() #define SZ(x) ((int)(x).size()) #define lson l, mid, rt<<1 #define rson mid+1, r, rt<<1|1 typedef struct DLX { static const int maxc = 4*16*16 + 5; static const int maxr = 16*16*16 + 5; static const int maxnode = 16*16*16*4 + 5; int n, sz; int S[maxc]; int row[maxnode], col[maxnode]; int L[maxnode], R[maxnode], U[maxnode], D[maxnode]; int ansd, ans[maxr]; void init(int n_) { n = n_; for (int i=0; i<=n; ++i) { L[i] = i - 1; R[i] = i + 1; U[i] = i; D[i] = i; } L[0] = n; R = 0; sz = n + 1; memset(S, 0, sizeof(S)); } void addRow(int r, vi columns) { int first = sz; int size = SZ(columns); for (int i=0; i<size; ++i) { int c = columns[i]; L[sz] = sz - 1; R[sz] = sz + 1; D[sz] = c; U[sz] = U[c]; D[U[c]] = sz; U[c] = sz; row[sz] = r; col[sz] = c; S[c]++; sz++; } R[sz - 1] = first; L[first] = sz - 1; } void remove(int c) { L[R[c]] = L[c]; R[L[c]] = R[c]; for (int i=D[c]; i!=c; i=D[i]) { for (int j=R[i]; j!=i; j=R[j]) { U[D[j]] = U[j]; D[U[j]] = D[j]; --S[col[j]]; } } } void restore(int c) { for (int i=U[c]; i!=c; i=U[i]) { for (int j=L[i]; j!=i; j=L[j]) { ++S[col[j]]; U[D[j]] = j; D[U[j]] = j; } } L[R[c]] = c; R[L[c]] = c; } bool dfs(int d) { if (R[0] == 0) { ansd = d; return true; } int c = R[0]; for (int i=R[0]; i!=0; i=R[i]) { if (S[i] < S[c]) c = i; } remove(c); for (int i=D[c]; i!=c; i=D[i]) { ans[d] = row[i]; for (int j=R[i]; j!=i; j=R[j]) { remove(col[j]); } if (dfs(d+1)) return true; for (int j=L[i]; j!=i; j=L[j]) { restore(col[j]); } } restore(c); return false; } bool solve(vector<int>& v) { v.clr(); if (!dfs(0)) return false; for (int i=0; i<ansd; ++i) v.pb(ans[i]); return true; } } DLX; DLX solver; const int SLOT = 0; const int ROW = 1; const int COL = 2; const int SUB = 3; int encode(int a, int b, int c) { return a*256+b*16+c+1; } void decode(int code, int& a, int& b, int& c) { --code; c = code%16; code /= 16; b = code%16; code /= 16; a = code; } char puzzle[16][20]; bool read() { rep(i, 0, 16) if (scanf("%s", puzzle[i])!=1) return false; return true; } int main() { ios::sync_with_stdio(false); #ifndef ONLINE_JUDGE freopen("data.in", "r", stdin); freopen("data.out", "w", stdout); #endif int kase = 0; while (read()) { if (kase++) putchar('\n'); solver.init(1024); rep(r, 0, 16) { rep(c, 0, 16) { rep(v, 0, 16) { if (puzzle[r][c]=='-' || puzzle[r][c]=='A'+v) { vi columns; columns.pb(encode(SLOT, r, c)); columns.pb(encode(ROW, r, v)); columns.pb(encode(COL, c, v)); columns.pb(encode(SUB, r/4*4+c/4, v)); solver.addRow(encode(r, c, v), columns); } } } } vi ans; bool flag = solver.solve(ans); #ifndef ONLINE_JUDGE puts(flag ? "Yes":"No"); #endif int sz = SZ(ans); rep(i, 0, sz) { int r, c, v; decode(ans[i], r, c, v); puzzle[r][c] = v + 'A'; } rep(i, 0, 16) puts(puzzle[i]); } #ifndef ONLINE_JUDGE printf("time = %d.\n", (int)clock()); #endif return 0; }
相关文章推荐
- 正则表达式
- sql语句按照汉字拼音首字母排序
- 在unity中不销毁物件
- Android之Service学习篇一:Service启动方式之startService
- Maven使用常见问题
- Android Contacts(一)—— 读取联系人
- iOS7以后 视图Frame坐标起点发生的变化
- CAN与CANopen协议的关系
- SparkStreaming实验错误
- Linux 的启动流程
- php连接oracle10数据库 转载
- 函数式编程-简介
- Android GridView属性集合
- Linux下输入输出流错误流 & 重定向 & 管道
- 支持2D/3D矢量图形处理控件VectorDraw v7.7006.1.0发布
- Axis1.3开发
- TextSwitcher为TextView实现平滑过渡
- Tomcat6、tomcat7 跨域设置
- js四种继承方式
- 《Mahout实战》学习一——Mahout自定义对象(草稿)