Code: Select all
// File: Buffer.cp
// Date: 17 December 2006.
// Version: 197 microseconds on PowerMac G3/233 MHz.
//
// Copyright (c) 2006 Cliff Huylebroeck. All Rights Reserved.
//
// Permission to use, copy, modify, and distribute this software
// and its documentation for NON-COMMERCIAL purposes and without
// fee is hereby granted provided that this copyright notice
// appears in all copies.
//
// Cliff Huylebroeck MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE
// SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT
// NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR
// a PARTICULAR PURPOSE, OR NON-INFRINGEMENT. Cliff Huylebroeck SHALL NOT
// BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING,
// MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
#include "Buffer.h"
#include "BlockMove.h"
#include "bool.h"
#include "Coordinaten.h"
#include "Debug.h"
#include "RandomGenerator.h"
Buffer::Buffer()
{
}
Buffer::Buffer(cpc_n1 tabel)
{
::BlockMove(tabel,
m_byte,
aVakken);
}
bool Buffer::IsOplossing() const
{
bool isGevondenInRij[aVakken];
bool isGevondenInKolom[aVakken];
bool isGevondenInKot[aVakken];
for (n1 i=0;i<aVakken;i++)
{
isGevondenInRij[i]=false;
isGevondenInKolom[i]=false;
isGevondenInKot[i]=false;
}
for (n1 index=0;index<aVakken;index++)
{
c_n1 cijfer=m_byte[index];
if (!cijfer)
{
return false;
}
c_n1 k=static_cast<n1>(cijfer-1);
rc_Coordinaten c=coordinaten[index];
// opm: isGevondenInRij[rij_k] wil zeggen:
// cijfer k+1 is gevonden in rij "rij" enz.
c_n1 rij_k=MaakIndex2(c.rij,
k);
if (isGevondenInRij[rij_k])
{
return false;
}
isGevondenInRij[rij_k]=true;
c_n1 kolom_k=MaakIndex2(c.kolom,
k);
if (isGevondenInKolom[kolom_k])
{
return false;
}
isGevondenInKolom[kolom_k]=true;
c_n1 kot_k=MaakIndex2(c.kot,
k);
if (isGevondenInKot[kot_k])
{
return false;
}
isGevondenInKot[kot_k]=true;
}
return true;
}
void Buffer::MaakRandom()
{
// opm: een random puzzel is een willekeurige volledig ingevulde puzzel.
static c_n1 normaal[aVakken]=
{
8,3,5,9,6,7,2,4,1,
9,7,4,3,1,2,8,6,5,
2,6,1,5,4,8,3,9,7,
3,9,8,2,7,5,6,1,4,
6,4,7,8,9,1,5,3,2,
5,1,2,6,3,4,9,7,8,
4,5,6,7,8,9,1,2,3,
7,8,9,1,2,3,4,5,6,
1,2,3,4,5,6,7,8,9
};
static c_n1 getransponeerd[aVakken]=
{
8,9,2,3,6,5,4,7,1,
3,7,6,9,4,1,5,8,2,
5,4,1,8,7,2,6,9,3,
9,3,5,2,8,6,7,1,4,
6,1,4,7,9,3,8,2,5,
7,2,8,5,1,4,9,3,6,
2,8,3,6,5,9,1,4,7,
4,6,9,1,3,7,2,5,8,
1,5,7,4,2,8,3,6,9
};
c_bool transponeer=rg.Geef_randomBool();
if (transponeer)
{
RoerDooreen(getransponeerd);
}
else
{
RoerDooreen(normaal);
}
}
void Buffer::RoerDooreen(cpc_n1 normaal)
{
// opm: SPECIALE KEUZE.
// Rijen en kolommen mogen verwisseld worden per drie
// (zodanig dat volledige kottekens worden verplaatst).
// Ze mogen ook per één worden verwisseld, maar dan moeten
// ze binnen hetzelfde kot blijven.
n1 rijVolgordePerKot[aKot];
n1 kolomVolgordePerKot[aKot];
n1 rijVolgordePer1[aKot][kotGrootte];
n1 kolomVolgordePer1[aKot][kotGrootte];
rg.Geef_random012(rijVolgordePerKot[0],
rijVolgordePerKot[1],
rijVolgordePerKot[2]);
rg.Geef_random012(kolomVolgordePerKot[0],
kolomVolgordePerKot[1],
kolomVolgordePerKot[2]);
for (n1 i=0;i<orde;i++)
{
rg.Geef_random012(rijVolgordePer1[i][0],
rijVolgordePer1[i][1],
rijVolgordePer1[i][2]);
rg.Geef_random012(kolomVolgordePer1[i][0],
kolomVolgordePer1[i][1],
kolomVolgordePer1[i][2]);
}
for (n1 kot_rij=0;kot_rij<aKot;kot_rij++)
{
c_n1 kot_rij_dooreen=rijVolgordePerKot[kot_rij];
for (n1 kot_kolom=0;kot_kolom<aKot;kot_kolom++)
{
c_n1 kot_kolom_dooreen=kolomVolgordePerKot[kot_kolom];
for (n1 kot_sub_r=0;kot_sub_r<kotGrootte;kot_sub_r++)
{
c_n1 kot_sub_r_dooreen=rijVolgordePer1[kot_rij][kot_sub_r];
c_n1 rij=MaakIndex(kot_rij,
kot_sub_r);
c_n1 rij_dooreen=MaakIndex(kot_rij_dooreen,
kot_sub_r_dooreen);
for (n1 kot_sub_k=0;kot_sub_k<kotGrootte;kot_sub_k++)
{
c_n1 kot_sub_k_dooreen=kolomVolgordePer1[kot_kolom][kot_sub_k];
c_n1 kolom=MaakIndex(kot_kolom,
kot_sub_k);
c_n1 kolom_dooreen=MaakIndex(kot_kolom_dooreen,
kot_sub_k_dooreen);
c_n1 index=MaakIndex2(rij,
kolom);
c_n1 index_dooreen=MaakIndex2(rij_dooreen,
kolom_dooreen);
m_byte[index_dooreen]=normaal[index];
}
}
}
}
}
void Buffer::Schrap(c_n1 aLegeVakken,
r_Buffer opgave) const
{
// opm: we gaan de indexen van de vakken in een tabel zetten.
n1 over[aVakken];
for (n1 index=0;index<aVakken;index++)
{
over[index]=index;
}
// opm: we kiezen aLegeVakken.
// Het i-de gekozen vak j vervangen we door het i-de vak.
// Daardoor zitten op de plaatsen i+1 tot en met aVakken_1
// de vakken waaruit we het i+1-de vak moeten kiezen.
n1 i;
for (i=0;i<aLegeVakken;i++)
{
c_n1 j=rg.Geef_random(i,
aVakken_1);
c_n1 index=over[j];
if (i!=j)
{
over[j]=over[i];
}
opgave.m_byte[index]=0;
}
// opm: daardoor zitten op de plaatsen i+1 tot en met aVakken_1
// de vakken die we gewoon kopi‘ren.
while (i<aVakken)
{
c_n1 index=over[i];
opgave.m_byte[index]=m_byte[index];
i++;
}
}
void Buffer::Debug_Dump() const
{
Debug_DumpLijn();
for (n1 kot_rij=0;kot_rij<aKot;kot_rij++)
{
for (n1 kot_sub_r=0;kot_sub_r<kotGrootte;kot_sub_r++)
{
c_n1 rij=MaakIndex(kot_rij,
kot_sub_r);
window.Schrijf("\p|");
for (n1 kot_kolom=0;kot_kolom<aKot;kot_kolom++)
{
for (n1 kot_sub_k=0;kot_sub_k<kotGrootte;kot_sub_k++)
{
c_n1 kolom=MaakIndex(kot_kolom,
kot_sub_k);
c_n1 index=MaakIndex2(rij,
kolom);
Debug_DumpCijfer(index);
}
window.Schrijf("\p|");
}
window.SchrijfLn();
}
Debug_DumpLijn();
}
}
void Buffer::Debug_DumpLijn() const
{
window.Schrijf("\p+");
for (n1 i=0;i<aKot;i++)
{
for (n1 j=0;j<kotGrootte;j++)
{
window.Schrijf("\p-");
}
window.Schrijf("\p+");
}
window.SchrijfLn();
}
void Buffer::Debug_DumpCijfer(c_n1 index) const
{
c_n1 cijfer=m_byte[index];
if (cijfer)
{
window.Schrijf(cijfer);
}
else
{
window.Schrijf("\p ");
}
}
void Buffer::Cpp_Dump() const
{
window.Schrijf("\p{");
window.SchrijfLn();
for (n1 rij=0;rij<puzzelGrootte;rij++)
{
window.Schrijf("\p ");
bool isEerste=true;
for (n1 kolom=0;kolom<puzzelGrootte;kolom++)
{
if (isEerste)
{
isEerste=false;
}
else
{
window.Schrijf("\p,");
}
c_n1 index=MaakIndex2(rij,
kolom);
Cpp_DumpCijfer(index);
}
if (rij<puzzelGrootte_1)
{
window.Schrijf("\p,");
}
window.SchrijfLn();
}
window.Schrijf("\p}");
}
void Buffer::Cpp_DumpCijfer(c_n1 index) const
{
c_n1 cijfer=m_byte[index];
window.Schrijf(cijfer);
}
void Buffer::Java_Dump() const
{
window.Schrijf("\p{");
window.SchrijfLn();
for (n1 rij=0;rij<puzzelGrootte;rij++)
{
window.Schrijf("\p {");
bool isEerste=true;
for (n1 kolom=0;kolom<puzzelGrootte;kolom++)
{
if (isEerste)
{
isEerste=false;
}
else
{
window.Schrijf("\p,");
}
c_n1 index=MaakIndex2(rij,
kolom);
Java_DumpCijfer(index);
}
window.Schrijf("\p}");
if (rij<puzzelGrootte_1)
{
window.Schrijf("\p,");
}
window.SchrijfLn();
}
window.Schrijf("\p}");
}
void Buffer::Java_DumpCijfer(c_n1 index) const
{
c_n1 cijfer=m_byte[index];
window.Schrijf(cijfer);
}