changed m,n to Coor class
changed every unsigned int m,n to coor myCoor. except of getPiece
This commit is contained in:
parent
067f64c9ab
commit
e66aa080bb
@ -37,13 +37,14 @@ void PuzzlePiece::randomCenterPiece()
|
|||||||
//use separator if you have to retract to a position
|
//use separator if you have to retract to a position
|
||||||
//seperator may be bigger than box size, if all puzzle pieces have already been looked at.
|
//seperator may be bigger than box size, if all puzzle pieces have already been looked at.
|
||||||
// it immediately retracts again then (returns -1)
|
// it immediately retracts again then (returns -1)
|
||||||
unsigned int Puzzle::tryAllPieces(unsigned int m, unsigned int n, vector<PuzzlePiece>& myBox, unsigned int separator)
|
unsigned int Puzzle::tryAllPieces(coor myCoor, vector<PuzzlePiece>& myBox, unsigned int separator)
|
||||||
{
|
{
|
||||||
for(int i=separator; i<myBox.size();i++)
|
for(int i=separator; i<myBox.size();i++)
|
||||||
{
|
{
|
||||||
if(testRotationPiece(m,n,myBox[i]))
|
if(testRotationPiece(myCoor,myBox[i]))
|
||||||
{
|
{
|
||||||
setPiece(m,n,myBox[i]);
|
//setPiece(myCoor.m,myCoor.n,myBox[i]);
|
||||||
|
setPiece(myCoor,myBox[i]);
|
||||||
myBox.erase(myBox.begin()+i);
|
myBox.erase(myBox.begin()+i);
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
@ -53,11 +54,12 @@ unsigned int Puzzle::tryAllPieces(unsigned int m, unsigned int n, vector<PuzzleP
|
|||||||
}
|
}
|
||||||
|
|
||||||
//tests the myPart in all 4 rotations at position m, n
|
//tests the myPart in all 4 rotations at position m, n
|
||||||
bool Puzzle::testRotationPiece(unsigned int m, unsigned int n, PuzzlePiece& myPart, int nrOfRotations)
|
bool Puzzle::testRotationPiece(coor myCoor, PuzzlePiece& myPart, int nrOfRotations)
|
||||||
{
|
{
|
||||||
for(int rotation=0; rotation < nrOfRotations; rotation++)
|
for(int rotation=0; rotation < nrOfRotations; rotation++)
|
||||||
{
|
{
|
||||||
if(PlaceOfPartGood(m,n,myPart))
|
//coor myCoor(m,n);
|
||||||
|
if(PlaceOfPartGood(myCoor,myPart))
|
||||||
return 1;
|
return 1;
|
||||||
//cout << "was rotated in testRotationPiece" << endl;
|
//cout << "was rotated in testRotationPiece" << endl;
|
||||||
myPart.shift(1);
|
myPart.shift(1);
|
||||||
@ -69,7 +71,7 @@ bool Puzzle::testRotationPiece(unsigned int m, unsigned int n, PuzzlePiece& myPa
|
|||||||
|
|
||||||
//insterts piece at position in box according to boxidentifier and removes piece from puzzle
|
//insterts piece at position in box according to boxidentifier and removes piece from puzzle
|
||||||
//this returns the position after!! the puzzle piece was put back in! not the boxidentifier of the piece. look that up in other function.
|
//this returns the position after!! the puzzle piece was put back in! not the boxidentifier of the piece. look that up in other function.
|
||||||
unsigned int Puzzle::putBackIntoBox(unsigned int m, unsigned int n, vector<PuzzlePiece>& myBox)
|
unsigned int Puzzle::putBackIntoBox(coor myCoor, vector<PuzzlePiece>& myBox)
|
||||||
{
|
{
|
||||||
#ifdef debug
|
#ifdef debug
|
||||||
cout << "putting back" << endl;
|
cout << "putting back" << endl;
|
||||||
@ -79,29 +81,29 @@ cout << endl;
|
|||||||
#endif
|
#endif
|
||||||
for(int i = 0; i < myBox.size();i++)
|
for(int i = 0; i < myBox.size();i++)
|
||||||
{
|
{
|
||||||
if(myBox[i].getBoxIdentifier()>getPiece(m,n).getBoxIdentifier())
|
if(myBox[i].getBoxIdentifier()>getPiece(myCoor.m,myCoor.n).getBoxIdentifier())
|
||||||
{
|
{
|
||||||
myBox.insert(myBox.begin()+i,getPiece(m,n));
|
myBox.insert(myBox.begin()+i,getPiece(myCoor.m,myCoor.n));
|
||||||
removePiece(m,n);
|
removePiece(myCoor);
|
||||||
return i+1;
|
return i+1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//using push back, if the element was the last element in the vector chain
|
//using push back, if the element was the last element in the vector chain
|
||||||
myBox.push_back(getPiece(m,n));
|
myBox.push_back(getPiece(myCoor.m,myCoor.n));
|
||||||
removePiece(m,n);
|
removePiece(myCoor);
|
||||||
return myBox.size();
|
return myBox.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
//checks if the myPart in its current orientation is legal in position m, n
|
//checks if the myPart in its current orientation is legal in position m, n
|
||||||
bool Puzzle::PlaceOfPartGood(unsigned int m,unsigned int n, PuzzlePiece& myPart)
|
bool Puzzle::PlaceOfPartGood(coor myCoor, PuzzlePiece& myPart)
|
||||||
{
|
{
|
||||||
|
|
||||||
PuzzlePiece negativePart(0);
|
PuzzlePiece negativePart(0);
|
||||||
|
|
||||||
negativePart.setConnections(negativePart.getConnections() | (getPiece(m,n+1).getConnections() & 0b11000000));
|
negativePart.setConnections(negativePart.getConnections() | (getPiece(myCoor.m,myCoor.n+1).getConnections() & 0b11000000));
|
||||||
negativePart.setConnections(negativePart.getConnections() | (getPiece(m-1,n).getConnections() & 0b00110000));
|
negativePart.setConnections(negativePart.getConnections() | (getPiece(myCoor.m-1,myCoor.n).getConnections() & 0b00110000));
|
||||||
negativePart.setConnections(negativePart.getConnections() | (getPiece(m,n-1).getConnections() & 0b00001100));
|
negativePart.setConnections(negativePart.getConnections() | (getPiece(myCoor.m,myCoor.n-1).getConnections() & 0b00001100));
|
||||||
negativePart.setConnections(negativePart.getConnections() | (getPiece(m+1,n).getConnections() & 0b00000011));
|
negativePart.setConnections(negativePart.getConnections() | (getPiece(myCoor.m+1,myCoor.n).getConnections() & 0b00000011));
|
||||||
negativePart.shift(2);
|
negativePart.shift(2);
|
||||||
|
|
||||||
|
|
||||||
@ -140,7 +142,7 @@ bool Puzzle::PlaceOfPartGood(unsigned int m,unsigned int n, PuzzlePiece& myPart)
|
|||||||
//TODO!!
|
//TODO!!
|
||||||
//simpler algorithm to the first placeofpartgood
|
//simpler algorithm to the first placeofpartgood
|
||||||
//not yet functional!!!
|
//not yet functional!!!
|
||||||
bool Puzzle::PlaceOfPart2Good(unsigned int m,unsigned int n, PuzzlePiece& myPart)
|
bool Puzzle::PlaceOfPart2Good(coor myCoor, PuzzlePiece& myPart)
|
||||||
{
|
{
|
||||||
PuzzlePiece tmpPuzzlePiece = myPart;
|
PuzzlePiece tmpPuzzlePiece = myPart;
|
||||||
|
|
||||||
@ -156,10 +158,10 @@ bool Puzzle::PlaceOfPart2Good(unsigned int m,unsigned int n, PuzzlePiece& myPart
|
|||||||
|
|
||||||
PuzzlePiece negativePart(0);
|
PuzzlePiece negativePart(0);
|
||||||
|
|
||||||
negativePart.setConnections(negativePart.getConnections() | (getPiece(m,n+1).getConnections() & 0b11000000));
|
negativePart.setConnections(negativePart.getConnections() | (getPiece(myCoor.m,myCoor.n+1).getConnections() & 0b11000000));
|
||||||
negativePart.setConnections(negativePart.getConnections() | (getPiece(m-1,n).getConnections() & 0b00110000));
|
negativePart.setConnections(negativePart.getConnections() | (getPiece(myCoor.m-1,myCoor.n).getConnections() & 0b00110000));
|
||||||
negativePart.setConnections(negativePart.getConnections() | (getPiece(m,n-1).getConnections() & 0b00001100));
|
negativePart.setConnections(negativePart.getConnections() | (getPiece(myCoor.m,myCoor.n-1).getConnections() & 0b00001100));
|
||||||
negativePart.setConnections(negativePart.getConnections() | (getPiece(m+1,n).getConnections() & 0b00000011));
|
negativePart.setConnections(negativePart.getConnections() | (getPiece(myCoor.m+1,myCoor.n).getConnections() & 0b00000011));
|
||||||
|
|
||||||
negativePart.shift(2);
|
negativePart.shift(2);
|
||||||
|
|
||||||
@ -191,7 +193,9 @@ void Puzzle::printPuzzle()
|
|||||||
//creates a legal puzzle out of random pieces
|
//creates a legal puzzle out of random pieces
|
||||||
void randomBox::createRandomPuzzle()
|
void randomBox::createRandomPuzzle()
|
||||||
{
|
{
|
||||||
|
coor myCoor;
|
||||||
PuzzlePiece temporaryRandomPiece(0);
|
PuzzlePiece temporaryRandomPiece(0);
|
||||||
|
|
||||||
for(int i=0;i<getRows();i++)
|
for(int i=0;i<getRows();i++)
|
||||||
{
|
{
|
||||||
for(int j = 0; j < getCols();)
|
for(int j = 0; j < getCols();)
|
||||||
@ -208,10 +212,12 @@ void randomBox::createRandomPuzzle()
|
|||||||
if(j==getCols()-1)
|
if(j==getCols()-1)
|
||||||
temporaryRandomPiece.setConnections(0b11001111 & temporaryRandomPiece.getConnections());
|
temporaryRandomPiece.setConnections(0b11001111 & temporaryRandomPiece.getConnections());
|
||||||
|
|
||||||
if(PlaceOfPartGood(j,i,temporaryRandomPiece))
|
myCoor.m = j;
|
||||||
|
myCoor.n = i;
|
||||||
|
if(PlaceOfPartGood(myCoor,temporaryRandomPiece))
|
||||||
{
|
{
|
||||||
temporaryRandomPiece.assignIdentifier();
|
temporaryRandomPiece.assignIdentifier();
|
||||||
setPiece(j,i,temporaryRandomPiece);
|
setPiece(myCoor,temporaryRandomPiece);
|
||||||
j++;
|
j++;
|
||||||
Box.push_back(temporaryRandomPiece);
|
Box.push_back(temporaryRandomPiece);
|
||||||
}
|
}
|
||||||
@ -242,9 +248,9 @@ vector<PuzzlePiece> randomBox::shuffle()
|
|||||||
}
|
}
|
||||||
|
|
||||||
//creates a random box size m, n, shuffles it, and then retuns it
|
//creates a random box size m, n, shuffles it, and then retuns it
|
||||||
vector<PuzzlePiece> createBox(unsigned int m, unsigned int n)
|
vector<PuzzlePiece> createBox(coor myCoor)
|
||||||
{
|
{
|
||||||
randomBox myFirstPuzzleBox(m,n);
|
randomBox myFirstPuzzleBox(myCoor.m, myCoor.n);
|
||||||
myFirstPuzzleBox.createRandomPuzzle();
|
myFirstPuzzleBox.createRandomPuzzle();
|
||||||
return myFirstPuzzleBox.shuffle();
|
return myFirstPuzzleBox.shuffle();
|
||||||
}
|
}
|
||||||
|
@ -131,7 +131,7 @@ void abstractionlayer1solver(vector<LogEntry>& log, vector<PuzzlePiece*>& p_Box,
|
|||||||
{
|
{
|
||||||
(*(log.back().PieceCollector[i])).resetShift();
|
(*(log.back().PieceCollector[i])).resetShift();
|
||||||
//TODO: change checker from checking every box piece to only checking the simplifyed version ob the box with abstraction layer one
|
//TODO: change checker from checking every box piece to only checking the simplifyed version ob the box with abstraction layer one
|
||||||
if(!(puzzleMat.testRotationPiece(log.back().myCoor.m, log.back().myCoor.n, *(log.back().PieceCollector[i]))))
|
if(!(puzzleMat.testRotationPiece(log.back().myCoor, *(log.back().PieceCollector[i]))))
|
||||||
log.back().PieceCollector.erase(log.back().PieceCollector.begin()+i);
|
log.back().PieceCollector.erase(log.back().PieceCollector.begin()+i);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -153,9 +153,10 @@ void setsolution(vector<LogEntry>& log, vector<PuzzlePiece*>& p_Box, Puzzle& puz
|
|||||||
i++;
|
i++;
|
||||||
|
|
||||||
//turn piece until it fits and then set element into matrix
|
//turn piece until it fits and then set element into matrix
|
||||||
if(puzzleMat.testRotationPiece(log.back().myCoor.m, log.back().myCoor.n,*(log.back().PieceCollector[0])))
|
if(puzzleMat.testRotationPiece(log.back().myCoor,*(log.back().PieceCollector[0])))
|
||||||
//error if it turned
|
//error if it turned
|
||||||
puzzleMat.setPiece(log.back().myCoor.m, log.back().myCoor.n, *(log.back().PieceCollector[0]));
|
//puzzleMat.setPiece(log.back().myCoor.m, log.back().myCoor.n, *(log.back().PieceCollector[0]));
|
||||||
|
puzzleMat.setPiece(log.back().myCoor, *(log.back().PieceCollector[0]));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cout << "fatal error, wrong piece saved" << endl;
|
cout << "fatal error, wrong piece saved" << endl;
|
||||||
@ -172,7 +173,7 @@ bool backtrack(vector<LogEntry>& log, vector<PuzzlePiece*>& p_Box, Puzzle& puzzl
|
|||||||
//last log entry empty - delete last log + backtrack
|
//last log entry empty - delete last log + backtrack
|
||||||
if(!(log.back().PieceCollector.size()))
|
if(!(log.back().PieceCollector.size()))
|
||||||
{
|
{
|
||||||
puzzleMat.removePiece(log.back().myCoor.m, log.back().myCoor.n);
|
puzzleMat.removePiece(log.back().myCoor);
|
||||||
log.pop_back();
|
log.pop_back();
|
||||||
backtrack(log,p_Box,puzzleMat);
|
backtrack(log,p_Box,puzzleMat);
|
||||||
return 1;
|
return 1;
|
||||||
@ -187,7 +188,7 @@ bool backtrack(vector<LogEntry>& log, vector<PuzzlePiece*>& p_Box, Puzzle& puzzl
|
|||||||
while((log.back().PieceCollector[0])->getShift() !=0 && (log.back().PieceCollector[0])->getShift() !=3)
|
while((log.back().PieceCollector[0])->getShift() !=0 && (log.back().PieceCollector[0])->getShift() !=3)
|
||||||
{
|
{
|
||||||
log.back().PieceCollector[0]->shift(1);
|
log.back().PieceCollector[0]->shift(1);
|
||||||
if(puzzleMat.testRotationPiece(log.back().myCoor.m, log.back().myCoor.n, *(log.back().PieceCollector[0]), 1))
|
if(puzzleMat.testRotationPiece(log.back().myCoor, *(log.back().PieceCollector[0]), 1))
|
||||||
{
|
{
|
||||||
setsolution(log,p_Box,puzzleMat);
|
setsolution(log,p_Box,puzzleMat);
|
||||||
return 1;
|
return 1;
|
||||||
@ -197,7 +198,7 @@ bool backtrack(vector<LogEntry>& log, vector<PuzzlePiece*>& p_Box, Puzzle& puzzl
|
|||||||
p_Box.push_back(log.back().PieceCollector[0]);
|
p_Box.push_back(log.back().PieceCollector[0]);
|
||||||
//shuffleup
|
//shuffleup
|
||||||
random_shuffle(p_Box.begin(),p_Box.end());
|
random_shuffle(p_Box.begin(),p_Box.end());
|
||||||
puzzleMat.removePiece(log.back().myCoor.m, log.back().myCoor.n);
|
puzzleMat.removePiece(log.back().myCoor);
|
||||||
log.pop_back();
|
log.pop_back();
|
||||||
//cout << "removed" << endl;
|
//cout << "removed" << endl;
|
||||||
//status(log,p_Box,puzzleMat);
|
//status(log,p_Box,puzzleMat);
|
||||||
@ -216,7 +217,7 @@ bool backtrack(vector<LogEntry>& log, vector<PuzzlePiece*>& p_Box, Puzzle& puzzl
|
|||||||
while((log.back().PieceCollector[0])->getShift() !=0 && (log.back().PieceCollector[0])->getShift() !=3)
|
while((log.back().PieceCollector[0])->getShift() !=0 && (log.back().PieceCollector[0])->getShift() !=3)
|
||||||
{
|
{
|
||||||
log.back().PieceCollector[0]->shift(1);
|
log.back().PieceCollector[0]->shift(1);
|
||||||
if(puzzleMat.testRotationPiece(log.back().myCoor.m, log.back().myCoor.n, *(log.back().PieceCollector[0]), 1))
|
if(puzzleMat.testRotationPiece(log.back().myCoor, *(log.back().PieceCollector[0]), 1))
|
||||||
{
|
{
|
||||||
setsolution(log,p_Box,puzzleMat);
|
setsolution(log,p_Box,puzzleMat);
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -1,6 +1,13 @@
|
|||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
class coor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
int m, n;
|
||||||
|
coor(int newm=-1,int newn=-1): m(newm), n(newn)
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
class PuzzlePiece: public Part
|
class PuzzlePiece: public Part
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -68,36 +75,36 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool setPiece(unsigned int m,unsigned int n,PuzzlePiece newPiece)
|
bool setPiece(coor myCoor,PuzzlePiece newPiece) // 5th change: works
|
||||||
{
|
{
|
||||||
if(PlaceOfPartGood(m,n,newPiece))
|
if(PlaceOfPartGood(myCoor,newPiece))
|
||||||
{
|
{
|
||||||
Matrix[n+1][m+1] = newPiece;
|
Matrix[myCoor.n+1][myCoor.m+1] = newPiece;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//removes piece and instead puts undefined piece
|
//removes piece and instead puts undefined piece
|
||||||
bool removePiece(unsigned int m,unsigned int n)
|
bool removePiece(coor myCoor) // 6th change: works
|
||||||
{
|
{
|
||||||
Matrix[n+1][m+1].setConnections(0b11111111);
|
Matrix[myCoor.n+1][myCoor.m+1].setConnections(0b11111111);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//getter
|
//getter
|
||||||
PuzzlePiece getPiece(unsigned int m,unsigned int n) { return Matrix[n+1][m+1]; }
|
PuzzlePiece getPiece(unsigned int m, unsigned int n) { return Matrix[n+1][m+1]; } // 7th change: error m+1, n+1
|
||||||
unsigned int getCols(){ return col; }
|
unsigned int getCols(){ return col; }
|
||||||
unsigned int getRows(){ return row; }
|
unsigned int getRows(){ return row; }
|
||||||
|
|
||||||
//functtion definitions
|
//functtion definitions
|
||||||
void printPuzzle();
|
void printPuzzle();
|
||||||
bool PlaceOfPartGood(unsigned int m, unsigned int n, PuzzlePiece& myPart);
|
bool PlaceOfPartGood(coor myCoor, PuzzlePiece& myPart); // 8th change: works
|
||||||
bool PlaceOfPart2Good(unsigned int m,unsigned int n, PuzzlePiece& myPart);
|
bool PlaceOfPart2Good(coor myCoor, PuzzlePiece& myPart); // 2nd change: works
|
||||||
|
|
||||||
bool testRotationPiece(unsigned int m, unsigned int n, PuzzlePiece& myPart, int nrOfRotations=4);
|
bool testRotationPiece(coor myCoor, PuzzlePiece& myPart, int nrOfRotations=4); // 9th change: works
|
||||||
unsigned int tryAllPieces(unsigned int m, unsigned int n, vector<PuzzlePiece>& myBox, unsigned int separator);
|
unsigned int tryAllPieces(coor myCoor, vector<PuzzlePiece>& myBox, unsigned int separator); // 3rd change: works
|
||||||
unsigned int putBackIntoBox(unsigned int m, unsigned int n, vector<PuzzlePiece>& myBox);
|
unsigned int putBackIntoBox(coor myCoor, vector<PuzzlePiece>& myBox); // 4th change: works
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -124,13 +131,6 @@ private:
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class coor
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
int m, n;
|
|
||||||
coor(int newm=-1,int newn=-1): m(newm), n(newn)
|
|
||||||
{}
|
|
||||||
};
|
|
||||||
|
|
||||||
class LogEntry
|
class LogEntry
|
||||||
{
|
{
|
||||||
@ -170,7 +170,7 @@ unsigned int PuzzlePiece::idcount(0);
|
|||||||
|
|
||||||
|
|
||||||
void printBox(vector<PuzzlePiece> myBox);
|
void printBox(vector<PuzzlePiece> myBox);
|
||||||
vector<PuzzlePiece> createBox(unsigned int m, unsigned int n);
|
vector<PuzzlePiece> createBox(coor boxCoor); // 1st change: works
|
||||||
void numerateBox(vector<PuzzlePiece>& myBox);
|
void numerateBox(vector<PuzzlePiece>& myBox);
|
||||||
|
|
||||||
bool next(vector<LogEntry>& log, vector<PuzzlePiece*>& p_Box, Puzzle& puzzleMat);
|
bool next(vector<LogEntry>& log, vector<PuzzlePiece*>& p_Box, Puzzle& puzzleMat);
|
||||||
|
Loading…
Reference in New Issue
Block a user