[go: up one dir, main page]

Menu

[r232]: / trunk / cands.c  Maximize  Restore  History

Download this file

109 lines (91 with data), 2.5 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
/*
* This file is part of sudognu.
*
* Copyright (C) 2007-2009 Jens Baaran, Germany.
******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include "sudoku.h"
/*
******************************************************************************/
int get_random_cand(t_field cell) {
unsigned int istat, i;
istat = rand() % cell.ncand;
for (i=0; i<SIZE2; i++) {
if (cell.cand[i] > 0) {
if (istat == 0) return(i);
else istat--;
}
}
return(-1);
}
/*
******************************************************************************/
int get_random_cand2(t_field cell) {
extern FILE *devurandom;
unsigned int istat, i;
if (devurandom != NULL) {
if (fread(&istat,sizeof(unsigned int),1,devurandom) != 1) {
fprintf(stderr,"error while trying to read from /dev/urandom\n");
}
} else {
fprintf(stderr,"error: /dev/urandom isn't open for reading\n");
}
istat = istat % cell.ncand;
for (i=0; i<SIZE2; i++) {
if (cell.cand[i] > 0) {
if (istat == 0) return(i);
else istat--;
}
}
return(-1);
}
/*
******************************************************************************/
void update_num_candidates(t_sudoku *sudoku) {
int r, c, cc;
int size = sudoku->size;
for (r=0; r<size; r++) {
for (c=0; c<size; c++) {
sudoku->grid[r][c].ncand = 0;
for (cc=0; cc<size; cc++) {
if (sudoku->grid[r][c].cand[cc] != 0) sudoku->grid[r][c].ncand += 1;
}
}
}
}
/*
******************************************************************************/
void remove_candidates(t_sudoku *sudoku, int row, int col) {
int r, c;
int br = (row / SIZE);
int bc = (col / SIZE);
int cc = sudoku->grid[row][col].value-1;
int size = sudoku->size;
for (c=0; c<size; c++) sudoku->grid[row][c].cand[cc] = 0;
for (r=0; r<size; r++) sudoku->grid[r][col].cand[cc] = 0;
for (r=0; r<size; r++) sudoku->grid[row][col].cand[r] = 0;
for (r=br*SIZE; r<(br+1)*SIZE; r++) {
for (c=bc*SIZE; c<(bc+1)*SIZE; c++) {
sudoku->grid[r][c].cand[cc] = 0;
}
}
update_num_candidates(sudoku);
}
/*
******************************************************************************/
void get_candidates(t_sudoku *sudoku) {
int c, r, cc;
int size = sudoku->size;
for (r=0; r<size; r++) {
for (c=0; c<size; c++) {
for (cc=0; cc<size; cc++) sudoku->grid[r][c].cand[cc] = cc+1;
}
}
for (r=0; r<size; r++) {
for (c=0; c<size; c++) {
if (sudoku->grid[r][c].value != 0) remove_candidates(sudoku,r,c);
}
}
update_num_candidates(sudoku);
}