void solveSudoku(std::vector<std::vector<char> > &board) { n = 9; char str[maxn*maxn]; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { str[i*9+j] = board[i][j]; } } str[n*n] = 0; h = 4*n*n; for (int c = 0; c <= h; ++c) { S[c] = 0; C[c] = D[c] = U[c] = c; L[c] = (c ? c-1:h), R[c] = (c==h ? 0:c+1); } ID = h + 1; for (int i = 0; str[i]; ++i) { int x = i / 9, y = i % 9; int lo = 1, hi = n; if ('1'<=str[i]&&str[i]<='0'+n) { lo = hi = str[i] - '0'; V[i] = str[i] - '0'; } for (int j = lo; j <= hi; ++j) { int a = add(i, j); int b = add(n*n+x*9+j-1, j); int c = add(2*n*n+y*9+j-1, j); int d = add(3*n*n+(x/3*3+y/3)*9+j-1, j); INSR(a, b); INSR(b, c); INSR(c, d); } } for (int i = R[h]; i != h; i = R[i]) { if (S[i] == 0) return; if (S[i] == 1) { N[i] = V[i]; DL(i); for (int j = D[i]; j != i; j = D[j]) { for (int k = R[j]; k != j; k = R[k]) DL(C[k]), N[C[k]] = V[k]; } } } succ = false; dfs(0); if (succ) { for (int i = 0; i < n*n; ++i) { board[i/9][i%9] = N[i] + '0'; } } }
void via_tick(struct Via65c22 *via, int ticks) { /* T1 */ if (via->T1run) { via->T1C -= ticks; if (via->T1C <= 0) { //console.log("Expired T1"); ifr_set(via, 64); if (via->ACR & 64) via->T1C = via->T1LL | (via->T1LH << 8); else via->T1run = 0; } } /* T2 */ via->T2C -= ticks; if (via->T2run) { if (via->T2C <= 0) { ifr_set(via, 32); via->T2run = 0; } } via->T2C &= 0xFFFF; /* shift register */ if (via->SRcount) { via->SRcount -= ticks; if (via->SRcount <= 0) { switch(via->SRmode) { case 0: via->SRcount = 0; ifr_clear(via, 4); break; // disabled case 2: via->SR = INSR(via); via->SRcount = 0; ifr_set(via, 4); break; // PHI2-in case 4: OUTSR(via, via->SR); via->SRcount = via->T2LL + 2; ifr_clear(via, 4); break; // free-T2-out, VIA2 seems to use this mode! default: via->SRcount = 0 ; ifr_clear(via, 4); alert(via, "SRmode is not supported!"); break; } } } }