Exemple #1
0
    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';
            }
        }
    }
Exemple #2
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;
			}
		}
	}
}