|
| [Ren C]Hvem kan forklare det her? Fra : Bertel Lund Hansen |
Dato : 03-04-06 19:18 |
|
Hej alle
Jeg er mystificeret.
Jeg har et program der fungerede fint indtil jeg lavede den
sidste tilføjelse - en ekstra blok i en funktion. Programmet kan
løse sudokuer (p.t. op til midterste sværhedgrad) og den blok i
rutinen skal undersøge om der findes en kandidat der kun må stå
ét sted i et 3*3-felt. Hvert enkeltfelt har et array hvor der
starter med at stå 1-taller ved hvert af de 9 cifre, og så
fjerner jeg efterhånden de umulige kandidater.
Programmet arbejder med et array af structs:
enum { SIZE=3, STRIPE=SIZE*SIZE };
struct field_struct {
int value;
int candidates[STRIPE+1]; // 0-pladsen går til spilde.
};
struct field_struct field[STRIPE][STRIPE]; // 81 små felter.
Den problematiske rutine er her med velfungerende kode klippet væk:
bool check_candidates (struct field_struct field[STRIPE][STRIPE]) {
int X, Y, x, y, x0, y0, candidate, sum;
bool change=0;
// Er der en kandidat der kun må være ét sted?
// Store felter
for (X=0; X<STRIPE; X+=SIZE)
for (Y=0; Y<STRIPE; Y+=SIZE)
for (candidate=1; candidate<=STRIPE; ++candidate) {
sum=0;
for (x=X; x<X+SIZE; ++x)
for (y=Y; y<Y+SIZE; ++y)
if (field[x][y].candidates[candidate]) {
x0=x;
y0=y;
++sum;
}
if (sum==1) {
field[x][y].value=candidate;
change=1;
}
}
return change;
}
Det mærkelige er at hvis jeg remmer linjen ud med "++sum;", så
forsvinder problemet. Det viser sig i øvrigt ved en balladeboks
i stil med den man ser ved pointerfejl.
Jeg har prøvet at lade værdien af variablerne udskrives, og der er
ikke nogen uventede værdier at se.
--
Bertel
http://bertel.lundhansen.dk/ http://fiduso.dk/
| |
Preben 'Peppe' Guldb~ (03-04-2006)
| Kommentar Fra : Preben 'Peppe' Guldb~ |
Dato : 03-04-06 19:46 |
|
Bertel Lund Hansen wrote:
> Programmet kan
> løse sudokuer (p.t. op til midterste sværhedgrad) og den blok i
> rutinen skal undersøge om der findes en kandidat der kun må stå
> ét sted i et 3*3-felt.
[...]
> bool check_candidates (struct field_struct field[STRIPE][STRIPE]) {
> int X, Y, x, y, x0, y0, candidate, sum;
> bool change=0;
> // Er der en kandidat der kun må være ét sted?
> // Store felter
> for (X=0; X<STRIPE; X+=SIZE)
> for (Y=0; Y<STRIPE; Y+=SIZE)
> for (candidate=1; candidate<=STRIPE; ++candidate) {
> sum=0;
> for (x=X; x<X+SIZE; ++x)
> for (y=Y; y<Y+SIZE; ++y)
> if (field[x][y].candidates[candidate]) {
> x0=x;
> y0=y;
> ++sum;
> }
> if (sum==1) {
> field[x][y].value=candidate;
Burde dette ikke vaere:
field[x0][y0].value=candidate;
> change=1;
> }
> }
> return change;
> }
> Det mærkelige er at hvis jeg remmer linjen ud med "++sum;", så
> forsvinder problemet. Det viser sig i øvrigt ved en balladeboks
> i stil med den man ser ved pointerfejl.
Saa vidt jeg kan bedoemme vil du under vejs gemme din kandidat i
field[4][10], field[7][10] og field[10][10].
Preben
--
se nocp cpo=BceFsx!$ hid bs=2 ls=2 hls ic " P. Guldberg /bin/vi@wielders.org
se scs ai isf-== fdo-=block cino=t0,:0 hi=100 ru so=4 noea lz|if has('unix')
se sh=/bin/sh|en|syn on|filetype plugin indent on|ono S V/\n^-- $\\|\%$/<CR>
cno <C-A> <C-B>|au FileType vim,mail se sw=4 sts=4 et|let&tw=72+6*(&ft=~'v')
| |
Bertel Lund Hansen (03-04-2006)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 03-04-06 19:51 |
| | |
Bertel Brander (03-04-2006)
| Kommentar Fra : Bertel Brander |
Dato : 03-04-06 19:48 |
|
Bertel Lund Hansen wrote:
> for (X=0; X<STRIPE; X+=SIZE)
> for (Y=0; Y<STRIPE; Y+=SIZE)
> for (candidate=1; candidate<=STRIPE; ++candidate) {
> sum=0;
> for (x=X; x<X+SIZE; ++x)
> for (y=Y; y<Y+SIZE; ++y)
> if (field[x][y].candidates[candidate]) {
> x0=x;
> y0=y;
> ++sum;
> }
> if (sum==1) {
> field[x][y].value=candidate;
> change=1;
> }
> }
Så vidt jeg kan se kan x blive op til X + SIZE - 1, hvilket er det samme
som op til STRIPE + SIZE -1, og du har kun til STRIPE -1.
Hvis ikke du tæller sum op, vil du kun læse unden for arrayet
(sum == 1 bliver ikke sandt), og programmet går ikke ned.
Jeg har i øvrigt lavet et program til at løse sudoko i C++,
hvis det har interesse.
--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel
| |
Bertel Lund Hansen (03-04-2006)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 03-04-06 20:44 |
|
Bertel Brander skrev:
> Jeg har i øvrigt lavet et program til at løse sudoko i C++,
> hvis det har interesse.
Ja, det har det. Jeg er ved at løbe tør for ideer (har én endnu),
og programmet kan ikke knække den svære sudoku jeg bruger.
--
Bertel
http://bertel.lundhansen.dk/ http://fiduso.dk/
| |
Bertel Brander (03-04-2006)
| Kommentar Fra : Bertel Brander |
Dato : 03-04-06 20:49 |
|
Bertel Lund Hansen wrote:
> Bertel Brander skrev:
>
>> Jeg har i øvrigt lavet et program til at løse sudoko i C++,
>> hvis det har interesse.
>
> Ja, det har det. Jeg er ved at løbe tør for ideer (har én endnu),
> og programmet kan ikke knække den svære sudoku jeg bruger.
#include <iostream>
typedef unsigned char uint8_t;
uint8_t Maze[9][9] = // This is the sudoko to solve
{
{7,8,0,0,0,5,9,0,0},
{0,4,0,2,0,7,0,3,0},
{0,5,9,0,0,8,2,4,0},
{0,2,0,0,0,9,3,1,0},
{0,0,7,3,0,4,6,0,0},
{0,3,4,1,0,0,0,9,0},
{0,6,5,7,0,0,8,2,0},
{0,7,0,9,0,6,0,5,0},
{0,0,3,5,0,0,0,7,6}
};
bool IsValid(uint8_t aSudoko[9][9], int aX, int aY, uint8_t aVal)
{ // Will the sudoko be valid if we put aVal into [aX][aY]
int a;
for(a = 0; a < 9; a++)
if(aSudoko[aX][a] == aVal)
return false;
for(a = 0; a < 9; a++)
if(aSudoko[a][aY] == aVal)
return false;
int y = aY/3;
int x = aX/3;
if(aSudoko[x*3][y*3 + 0] == aVal || aSudoko[x*3 + 1][y*3 + 0] ==
aVal || aSudoko[x*3 + 2][y*3 + 0] == aVal ||
aSudoko[x*3][y*3 + 1] == aVal || aSudoko[x*3 + 1][y*3 + 1] ==
aVal || aSudoko[x*3 + 2][y*3 + 1] == aVal ||
aSudoko[x*3][y*3 + 2] == aVal || aSudoko[x*3 + 1][y*3 + 2] ==
aVal || aSudoko[x*3 + 2][y*3 + 2] == aVal)
{
return false;
}
return true;
}
bool Solve(uint8_t aSudoko[9][9])
{
int x, y;
uint8_t Val;
for(y = 0; y < 9; y++)
{
for(x = 0; x < 9; x++)
{
if(aSudoko[x][y] == 0)
{ // Have found a empty index, check all values
for(Val = 1; Val <= 9; Val++)
{
if(IsValid(aSudoko, x, y, Val))
{
aSudoko[x][y] = Val;
if(Solve(aSudoko))
return true;
}
}
aSudoko[x][y] = 0;
return false;
}
}
}
return true;
}
int main()
{
if(Solve(Maze))
{
std::cout << "Success" << std::endl;
int x, y;
for(y = 0; y < 9; y++)
{
for(x = 0; x < 9; x++)
std::cout << int(Maze[y][x]);
std::cout << std::endl;
}
}
else
{
std::cout << "Failed" << std::endl;
}
}
--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel
| |
Anders Wegge Jakobse~ (03-04-2006)
| Kommentar Fra : Anders Wegge Jakobse~ |
Dato : 03-04-06 20:53 |
|
Bertel Lund Hansen <nospamfilius@lundhansen.dk> writes:
> Bertel Brander skrev:
>
> > Jeg har i øvrigt lavet et program til at løse sudoko i C++,
> > hvis det har interesse.
>
> Ja, det har det. Jeg er ved at løbe tør for ideer (har én endnu),
> og programmet kan ikke knække den svære sudoku jeg bruger.
Der er en rimelig god vejledning på wikipedia:
< http://da.wikipedia.org/wiki/Sudoku>
--
// Wegge
Weblog: http://blog.wegge.dk
Wiki: http://wiki.wegge.dk
| |
Bertel Lund Hansen (03-04-2006)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 03-04-06 21:20 |
| | |
|
|