Beispiel #1
0
// get the n'th [row, col, square] (dependent on group_nr) 
set<gen_cell*>* gen_sudoku::getgroup(const uint n, const uint group_nr) const {
	set<gen_cell*>* group = new set<gen_cell*>();
	switch(group_nr){
		case 0: getrow(n, group); break;
		case 1: getcolumn(n, group); break;
		case 2: getsquare(n, group); break;
	}
	return group;
}
Beispiel #2
0
int		main(int ac, char **av)
{
	int		i;
	t_list	*start;

	if (launchread(av, ac, &start) == -1)
	{
		free_all(start);
		return (0);
	}
	i = getsquare(start);
	if (i > 0)
	{
		while (!(algo(start, start, i)))
			i++;
		printmap(start, i);
	}
	free_all(start);
	return (0);
}
Beispiel #3
0
// return a set of cells in the same square as cell (x,y)
void gen_sudoku::getsquare(const uint x, const uint y, set<gen_cell*>* group) const{
	uint order = (uint)sqrt((double)num_digits);
	uint sq_x = x / order;
	uint sq_y = y / order;
	getsquare(sq_y * order + sq_x, group);
}
Beispiel #4
0
void find_nearby_colors( int sr, int sg, int sb,
        byte palette[256][3], byte candidates[256])
{
    int mindist2_mas[256];
    int minmaxdist2 = 1<<30;

    memset(candidates, 0, 256);

    int mr = sr + kStepSize / 2;
    int mg = sg + kStepSize / 2;
    int mb = sb + kStepSize / 2;

    for ( int i = 0; i < 256; ++i ) {
        int r, g, b;

        r = palette[i][0];
        g = palette[i][1];
        b = palette[i][2];

        int v = 0;
        if ( inrange(r, sr, sr+kStepSize) ) {
            v |= 1;
        }

        if ( inrange(g, sg, sg+kStepSize) ) {
            v |= 2;
        }

        if ( inrange(b, sb, sb+kStepSize) ) {
            v |= 4;
        }

        int mindist2 = 0;
        switch ( v ) {
        case 7:
            mindist2 = 0;
            break;

        case 6:
            mindist2 = getsquare(sr - r);
            break;

        case 5:
            mindist2 = getsquare(sg - g);
            break;

        case 4:
            mindist2 = getsquare(getmin(abs(sg - g), abs(sr - r)));
            break;

        case 3:
            mindist2 = getsquare(sb - b);
            break;

        case 2:
            mindist2 = getsquare(getmin(abs(sb - b), abs(sr - r)));
            break;

        case 1:
            mindist2 = getsquare(getmin(abs(sb - b), abs(sg - g)));
            break;

        /* point case next */
        default:
            break;
        };

        int sign[3] = {0};

        sign[0] = b >= mb ? 1 : -1; //blue
        sign[1] = r >= mr ? 1 : -1; //red
        sign[2] = ( g >= mg ) ^ ( r < mr ) ? 1 : -1; //green

        if ( !v ) {
            int near_r = mr + sign[1] * kStepSize / 2;
            int near_g = mg + sign[2] * kStepSize / 2;
            int near_b = mb + sign[0] * kStepSize / 2;

            mindist2 = (near_r - r) * (near_r - r)
                + (near_g - g) * (near_g - g)
                + (near_b - b) * (near_b - b);
        }

        mindist2_mas[i] = mindist2;

        int far_r = mr + -sign[1] * kStepSize / 2;
        int far_g = mg + -sign[2] * kStepSize / 2;
        int far_b = mb + -sign[0] * kStepSize / 2;

        int maxdist2 = (far_r - r) * (far_r - r)
                + (far_g - g) * (far_g - g)
                + (far_b - b) * (far_b - b);

        if ( maxdist2 < minmaxdist2 ) {
            minmaxdist2 = maxdist2;
        }
    }

    for ( int i = 0; i < 256; ++i ) {
        if ( mindist2_mas[i] <= minmaxdist2 ) {
            candidates[i] = mindist2_mas[i] <= minmaxdist2;
        }
    }
}