edited file structure to better represent our current system. added entire code base
This commit is contained in:
		
							
								
								
									
										283
									
								
								Source/functions/solve/classExtension.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										283
									
								
								Source/functions/solve/classExtension.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,283 @@
 | 
			
		||||
 | 
			
		||||
//shifts puzzle piece one to the right
 | 
			
		||||
void PuzzlePiece::shift(unsigned int moves)
 | 
			
		||||
{
 | 
			
		||||
    shifts = (shifts+moves)%4;
 | 
			
		||||
    setConnections(((getConnections() >> (moves*2)) | (getConnections() << sizeof(unsigned char)*8 - (moves*2))));     
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//creates random centerpiece
 | 
			
		||||
void PuzzlePiece::randomCenterPiece()
 | 
			
		||||
{
 | 
			
		||||
    setConnections(0b00000000);
 | 
			
		||||
 | 
			
		||||
    if(rand()%2)
 | 
			
		||||
        setConnections(getConnections() | 0b01000000);
 | 
			
		||||
    else
 | 
			
		||||
        setConnections(getConnections() | 0b10000000);
 | 
			
		||||
 | 
			
		||||
    if(rand()%2)
 | 
			
		||||
        setConnections(getConnections() | 0b00010000);
 | 
			
		||||
    else
 | 
			
		||||
        setConnections(getConnections() | 0b00100000);
 | 
			
		||||
 | 
			
		||||
    if(rand()%2)
 | 
			
		||||
        setConnections(getConnections() | 0b00000100);
 | 
			
		||||
    else
 | 
			
		||||
        setConnections(getConnections() | 0b00001000);
 | 
			
		||||
 | 
			
		||||
    if(rand()%2)
 | 
			
		||||
        setConnections(getConnections() | 0b00000001);
 | 
			
		||||
    else
 | 
			
		||||
        setConnections(getConnections() | 0b00000010);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//tries all pieces in box from separator to end and places fitting into matrix. removes fitting piece
 | 
			
		||||
//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.
 | 
			
		||||
// it immediately retracts again then (returns -1)
 | 
			
		||||
unsigned int Puzzle::tryAllPieces(unsigned int m, unsigned int n, vector<PuzzlePiece>& myBox, unsigned int separator)
 | 
			
		||||
{
 | 
			
		||||
    for(int i=separator; i<myBox.size();i++)
 | 
			
		||||
    {
 | 
			
		||||
        if(testRotationPiece(m,n,myBox[i]))
 | 
			
		||||
        {
 | 
			
		||||
            setPiece(m,n,myBox[i]);
 | 
			
		||||
            myBox.erase(myBox.begin()+i);
 | 
			
		||||
            return i;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//tests the myPart in all 4 rotations at position m, n
 | 
			
		||||
bool Puzzle::testRotationPiece(unsigned int m, unsigned int n, PuzzlePiece& myPart)
 | 
			
		||||
{
 | 
			
		||||
    for(int rotation=0; rotation < 4; rotation++)
 | 
			
		||||
    {
 | 
			
		||||
        if(PlaceOfPartGood(m,n, myPart))
 | 
			
		||||
            return 1;
 | 
			
		||||
        myPart.shift(1);
 | 
			
		||||
    }
 | 
			
		||||
#ifdef debug
 | 
			
		||||
cout << "bad part: ";
 | 
			
		||||
myPart.printPiece();
 | 
			
		||||
cout << endl;
 | 
			
		||||
#endif
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//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.
 | 
			
		||||
unsigned int Puzzle::putBackIntoBox(unsigned int m, unsigned int n, vector<PuzzlePiece>& myBox)
 | 
			
		||||
{
 | 
			
		||||
#ifdef debug
 | 
			
		||||
cout << "putting back" << endl;
 | 
			
		||||
cout << "Old Box: "; 
 | 
			
		||||
printBox(myBox);
 | 
			
		||||
cout << endl;
 | 
			
		||||
#endif
 | 
			
		||||
    for(int i = 0; i < myBox.size();i++)
 | 
			
		||||
    {
 | 
			
		||||
        if(myBox[i].getBoxIdentifier()>getPiece(m,n).getBoxIdentifier())
 | 
			
		||||
            {
 | 
			
		||||
                myBox.insert(myBox.begin()+i,getPiece(m,n));
 | 
			
		||||
                removePiece(m,n);
 | 
			
		||||
                return i+1;
 | 
			
		||||
            }
 | 
			
		||||
    }
 | 
			
		||||
    //using push back, if the element was the last element in the vector chain
 | 
			
		||||
    myBox.push_back(getPiece(m,n));
 | 
			
		||||
    removePiece(m,n);
 | 
			
		||||
    return myBox.size();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//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)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    PuzzlePiece negativePart(0);
 | 
			
		||||
 | 
			
		||||
    negativePart.setConnections(negativePart.getConnections() | (getPiece(m,n+1).getConnections() & 0b11000000));
 | 
			
		||||
    negativePart.setConnections(negativePart.getConnections() | (getPiece(m-1,n).getConnections() & 0b00110000));
 | 
			
		||||
    negativePart.setConnections(negativePart.getConnections() | (getPiece(m,n-1).getConnections() & 0b00001100));
 | 
			
		||||
    negativePart.setConnections(negativePart.getConnections() | (getPiece(m+1,n).getConnections() & 0b00000011));
 | 
			
		||||
    negativePart.shift(2);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    if  ( 
 | 
			
		||||
          (    ((((negativePart.getConnections() & 0b11000000) ^  (myPart.getConnections() & 0b11000000))  != 0b00000000)                  && (((myPart.getConnections() & 0b11000000) != 0b00000000) && (negativePart.getConnections() & 0b11000000) != 0b00000000))
 | 
			
		||||
            || ((((negativePart.getConnections() & 0b11000000) == 0b11000000) || ((myPart.getConnections() &  0b11000000) == 0b11000000))  && (( myPart.getConnections() & 0b11000000) != 0b00000000) && (negativePart.getConnections() & 0b11000000) != 0b00000000)
 | 
			
		||||
            ||  (((negativePart.getConnections() & 0b11000000) == 0b00000000) && ((myPart.getConnections() &  0b11000000) == 0b00000000))  ) 
 | 
			
		||||
        &&
 | 
			
		||||
          (    ((((negativePart.getConnections() & 0b00110000) ^ (myPart.getConnections() & 0b00110000))  != 0b00000000)                   && (((myPart.getConnections() & 0b00110000) != 0b00000000) && (negativePart.getConnections() & 0b00110000) != 0b00000000))
 | 
			
		||||
            || ((((negativePart.getConnections() & 0b00110000) == 0b00110000) || ((myPart.getConnections() &  0b00110000) == 0b00110000))  && (((myPart.getConnections() & 0b00110000) != 0b00000000) && (negativePart.getConnections() & 0b00110000) != 0b00000000))
 | 
			
		||||
            ||  (((negativePart.getConnections() & 0b00110000) == 0b00000000) && ((myPart.getConnections() &  0b00110000) == 0b00000000))  ) 
 | 
			
		||||
        &&
 | 
			
		||||
          (    ((((negativePart.getConnections() & 0b00001100) ^  (myPart.getConnections() & 0b00001100))  != 0b00000000)                  && (((myPart.getConnections() & 0b00001100) != 0b00000000) && (negativePart.getConnections() & 0b00001100) != 0b00000000))
 | 
			
		||||
            || ((((negativePart.getConnections() & 0b00001100) == 0b00001100) || ((myPart.getConnections() &  0b00001100) == 0b00001100))  && (((myPart.getConnections() & 0b00001100) != 0b00000000) && (negativePart.getConnections() & 0b00001100) != 0b00000000))
 | 
			
		||||
            ||  (((negativePart.getConnections() & 0b00001100) == 0b00000000) && ((myPart.getConnections() &  0b00001100) == 0b00000000))  ) 
 | 
			
		||||
        &&
 | 
			
		||||
          (    ((((negativePart.getConnections() & 0b00000011) ^  (myPart.getConnections() & 0b00000011))  != 0b00000000)                  && (((myPart.getConnections() & 0b00000011) != 0b00000000) && (negativePart.getConnections() & 0b00000011) != 0b00000000))
 | 
			
		||||
            || ((((negativePart.getConnections() & 0b00000011) == 0b00000011) || ((myPart.getConnections() &  0b00000011) == 0b00000011))  && (((myPart.getConnections() & 0b00000011) != 0b00000000) && (negativePart.getConnections() & 0b00000011) != 0b00000000))
 | 
			
		||||
            ||  (((negativePart.getConnections() & 0b00000011) == 0b00000000) && ((myPart.getConnections() &  0b00000011) == 0b00000000))  )    
 | 
			
		||||
        )
 | 
			
		||||
    {
 | 
			
		||||
#ifdef debug        
 | 
			
		||||
cout << "good Part: ";
 | 
			
		||||
myPart.printPiece();
 | 
			
		||||
cout << endl;
 | 
			
		||||
#endif        
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//TODO!!
 | 
			
		||||
//simpler algorithm to the first placeofpartgood 
 | 
			
		||||
//not yet functional!!!
 | 
			
		||||
bool Puzzle::PlaceOfPart2Good(unsigned int m,unsigned int n, PuzzlePiece& myPart)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    PuzzlePiece negativePart(0);
 | 
			
		||||
 | 
			
		||||
    negativePart.setConnections(negativePart.getConnections() | (getPiece(m,n+1).getConnections() & 0b11000000));
 | 
			
		||||
    negativePart.setConnections(negativePart.getConnections() | (getPiece(m-1,n).getConnections() & 0b00110000));
 | 
			
		||||
    negativePart.setConnections(negativePart.getConnections() | (getPiece(m,n-1).getConnections() & 0b00001100));
 | 
			
		||||
    negativePart.setConnections(negativePart.getConnections() | (getPiece(m+1,n).getConnections() & 0b00000011));
 | 
			
		||||
    negativePart.shift(2);
 | 
			
		||||
 | 
			
		||||
    //A and D or B and C or not A and not B and not C and not D
 | 
			
		||||
 | 
			
		||||
    if  ( 
 | 
			
		||||
          (    (  (negativePart.getConnections() & 0b10000000)  &  (myPart.getConnections() & 0b01000000))
 | 
			
		||||
            || (  (negativePart.getConnections() & 0b01000000)  &  (myPart.getConnections() & 0b10000000))
 | 
			
		||||
            || ((!(negativePart.getConnections() & 0b10000000)  & !(myPart.getConnections() & 0b10000000)) & (!(negativePart.getConnections() & 0b01000000) & !(myPart.getConnections() & 0b01000000)))
 | 
			
		||||
          )
 | 
			
		||||
        &&
 | 
			
		||||
          (    (  (negativePart.getConnections() & 0b00100000)  &  (myPart.getConnections() & 0b00010000))
 | 
			
		||||
            || (  (negativePart.getConnections() & 0b00010000)  &  (myPart.getConnections() & 0b00100000))
 | 
			
		||||
            || ((!(negativePart.getConnections() & 0b00100000)  & !(myPart.getConnections() & 0b00100000)) & (!(negativePart.getConnections() & 0b00010000) & !(myPart.getConnections() & 0b00010000)))
 | 
			
		||||
          )
 | 
			
		||||
        &&
 | 
			
		||||
          (    (  (negativePart.getConnections() & 0b00001000)  &  (myPart.getConnections() & 0b00000100))
 | 
			
		||||
            || (  (negativePart.getConnections() & 0b00000100)  &  (myPart.getConnections() & 0b00001000))
 | 
			
		||||
            || ((!(negativePart.getConnections() & 0b00001000)  & !(myPart.getConnections() & 0b00001000)) & (!(negativePart.getConnections() & 0b00000100) & !(myPart.getConnections() & 0b00000100)))
 | 
			
		||||
          )
 | 
			
		||||
        &&
 | 
			
		||||
          (    (  (negativePart.getConnections() & 0b00000010)  &  (myPart.getConnections() & 0b00000001))
 | 
			
		||||
            || (  (negativePart.getConnections() & 0b00000001)  &  (myPart.getConnections() & 0b00000010))
 | 
			
		||||
            || ((!(negativePart.getConnections() & 0b00000010)  & !(myPart.getConnections() & 0b00000010)) & (!(negativePart.getConnections() & 0b00000001) & !(myPart.getConnections() & 0b00000001)))
 | 
			
		||||
          )
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        return 1;
 | 
			
		||||
 | 
			
		||||
    cout << "nogood" << endl;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//prints the true puzzle (without 0 edges)
 | 
			
		||||
void Puzzle::printPuzzle()
 | 
			
		||||
{
 | 
			
		||||
    cout << "current Puzzle: " << endl;
 | 
			
		||||
    for(int i=1;i<row+1;i++)
 | 
			
		||||
    {
 | 
			
		||||
        for(int j=1;j<col+1;j++)
 | 
			
		||||
        {
 | 
			
		||||
            Matrix[i][j].printPiece();
 | 
			
		||||
            cout << "  ";
 | 
			
		||||
        }
 | 
			
		||||
        cout << endl;
 | 
			
		||||
    }
 | 
			
		||||
    cout << endl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//creates a legal puzzle out of random pieces
 | 
			
		||||
void randomBox::createRandomPuzzle()
 | 
			
		||||
{
 | 
			
		||||
    PuzzlePiece temporaryRandomPiece(0);
 | 
			
		||||
    for(int i=0;i<getRows();i++)
 | 
			
		||||
    {
 | 
			
		||||
        for(int j = 0; j < getCols();)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
            //create random piece, set edges according to position and check if piece is good
 | 
			
		||||
            temporaryRandomPiece.randomCenterPiece();
 | 
			
		||||
            if(i==0)
 | 
			
		||||
                temporaryRandomPiece.setConnections(0b00111111 & temporaryRandomPiece.getConnections());  
 | 
			
		||||
            if(i==getRows()-1)
 | 
			
		||||
                temporaryRandomPiece.setConnections(0b11110011 & temporaryRandomPiece.getConnections());  
 | 
			
		||||
            if(j==0)
 | 
			
		||||
                temporaryRandomPiece.setConnections(0b11111100 & temporaryRandomPiece.getConnections());  
 | 
			
		||||
            if(j==getCols()-1)
 | 
			
		||||
                temporaryRandomPiece.setConnections(0b11001111 & temporaryRandomPiece.getConnections());  
 | 
			
		||||
 | 
			
		||||
            if(PlaceOfPartGood(j,i,temporaryRandomPiece))
 | 
			
		||||
            {
 | 
			
		||||
                temporaryRandomPiece.assignIdentifier();
 | 
			
		||||
                setPiece(j,i,temporaryRandomPiece);     
 | 
			
		||||
                j++;
 | 
			
		||||
                Box.push_back(temporaryRandomPiece);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//prints a box contents on console
 | 
			
		||||
void randomBox::printBox()
 | 
			
		||||
{
 | 
			
		||||
    shuffle();
 | 
			
		||||
    for (vector<PuzzlePiece>::iterator i = Box.begin(); i != Box.end(); i++)    
 | 
			
		||||
    {
 | 
			
		||||
        (*i).printPiece();
 | 
			
		||||
        cout << ' ';
 | 
			
		||||
    }       
 | 
			
		||||
    cout << endl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//shuffles around a box, randomizing pieces and orientation
 | 
			
		||||
vector<PuzzlePiece> randomBox::shuffle()
 | 
			
		||||
{
 | 
			
		||||
    random_shuffle(Box.begin(),Box.end());
 | 
			
		||||
    for (vector<PuzzlePiece>::iterator i = Box.begin(); i != Box.end(); i++)  
 | 
			
		||||
        (*i).shift(rand()%4);
 | 
			
		||||
    numerateBox(Box);
 | 
			
		||||
    return Box;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//creates a random box size m, n, shuffles it, and then retuns it
 | 
			
		||||
vector<PuzzlePiece> createBox(uint m, uint n)
 | 
			
		||||
{
 | 
			
		||||
    randomBox myFirstPuzzleBox(m,n); 
 | 
			
		||||
    myFirstPuzzleBox.createRandomPuzzle(); 
 | 
			
		||||
    return myFirstPuzzleBox.shuffle(); 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//prints contents of box
 | 
			
		||||
void printBox(vector<PuzzlePiece> myBox)
 | 
			
		||||
{
 | 
			
		||||
    cout << "current Box: " << endl;
 | 
			
		||||
    for (vector<PuzzlePiece>::iterator i = myBox.begin(); i != myBox.end(); i++)    
 | 
			
		||||
    {
 | 
			
		||||
        (*i).printPiece();
 | 
			
		||||
        cout << ' ';
 | 
			
		||||
    }   
 | 
			
		||||
    cout << endl;
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//gives every element in box a box identifier.
 | 
			
		||||
void numerateBox(vector<PuzzlePiece>& myBox)
 | 
			
		||||
{
 | 
			
		||||
    for(int i = 0; i< myBox.size();i++)
 | 
			
		||||
        myBox[i].setBoxIdentifier(i);
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										63
									
								
								Source/functions/solve/structure.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								Source/functions/solve/structure.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
			
		||||
 | 
			
		||||
bool next()
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    //calculates next move according to log
 | 
			
		||||
 | 
			
		||||
		//case puzzle solved
 | 
			
		||||
			//return 0;
 | 
			
		||||
 | 
			
		||||
        //case last log empty
 | 
			
		||||
            //backtrack
 | 
			
		||||
 | 
			
		||||
        //case last log exactly one solution
 | 
			
		||||
			//put all remaining puzzle pieces into new log entry
 | 
			
		||||
            //try next piece/place with solve abstraction level 0
 | 
			
		||||
 | 
			
		||||
        //case last log multiple entries
 | 
			
		||||
            //advance abstraction layer of last log by one and solve()
 | 
			
		||||
            //or pick first if highest level reached
 | 
			
		||||
 | 
			
		||||
		//return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void solve()
 | 
			
		||||
{
 | 
			
		||||
    //case
 | 
			
		||||
        //abstraction layer = 0
 | 
			
		||||
            //go to abstraction layer 0 solver
 | 
			
		||||
    
 | 
			
		||||
    //case
 | 
			
		||||
        //abstraction layer = 1
 | 
			
		||||
            //go to abstraction layer 1 solver
 | 
			
		||||
    //default
 | 
			
		||||
            //random one of the parts 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void abstractionlayer0solver()
 | 
			
		||||
{
 | 
			
		||||
    //throw all remaining puzzle pieces into log
 | 
			
		||||
        //remove all impossible
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void abstractionlayer1solver()
 | 
			
		||||
{
 | 
			
		||||
    //remove all impossible according to abstraction layer one
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void setsolution()
 | 
			
		||||
{
 | 
			
		||||
    //put 
 | 
			
		||||
    //set pointer to log into matrix 
 | 
			
		||||
}  
 | 
			
		||||
 | 
			
		||||
void backtrack()
 | 
			
		||||
{
 | 
			
		||||
    //following possibilities:
 | 
			
		||||
        //last log entry empty
 | 
			
		||||
            //delete last log + backtrack
 | 
			
		||||
        //last log entry only one solution
 | 
			
		||||
            //delete last log + backtrack
 | 
			
		||||
        //last log entry multiple solutions (and current one was randomed)
 | 
			
		||||
            //delete randomed piece from puzzleCollector and go to next (which might random again depending on function)
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user