示例#1
0
void House::setHouseOwner(uint32_t guid)
{
  if(isLoaded && houseOwner == guid)
    return;

  isLoaded = true;

  if(houseOwner){
    cleanHouse();

    //clean access lists
    houseOwner = 0;
    setAccessList(SUBOWNER_LIST, "");
    setAccessList(GUEST_LIST, "");

    for(HouseDoorList::iterator it = doorList.begin(); it != doorList.end(); ++it){
      (*it)->setAccessList("");
    }

    //reset paid date
    paidUntil = 0;
    rentWarnings = 0;
  }

  std::string name;
  if(guid != 0 && IOPlayer::instance()->getNameByGuid(guid, name)){
    houseOwner = guid;
    houseOwnerName = name;
  }

  updateDoorDescription();
  setLastWarning(std::time(NULL)); //So the new owner has one day before he start the payment
}
/*	Do any work that should be done before attempting to solve:
*
*	Sort clauses.
*	Check for empty clause.
*/
int startSolving() {
    sortClausesByLength(0,numClauses-1);

    if(!cleanHouse())
    {
        //clean house got down to an unsat condition
        return 0;
    }

    currentGuess=0;

    int returnValue=solve();
    while(returnValue==0) {
        returnValue=solve();
    }
    return returnValue;                   //SAT
}
/* Main solving function - iterative.
*
*   This needs to be converted into a variable eliminator with the ability to solve. It needs to focus on a single variable to
*   attempt to solve with, and if it cannot, that variable should be cleaned and cleanHouse should be ran after. If a
*   solution is found using that variable, just return 1 as it has to be SAT.
*/
int solve() {
    if(clauses[0]->length < 2) {
        //error: cleanHouse didn't properly run
        return -1;
    }

    int toElim = 0;


    for(int k = 0; k < numVariables; k++) {
        if(clauses[0]->variables[k]!=0) {
            toElim = clauses[0]->variables[k];
            //Check tried list to see if this variable has been tried yet
            if(toElim>0)
            {
                //Check if already tried true
                if(guesses[currentGuess].triedTrue[toElim-1])
                {
                    //Check if already tried false
                    if(guesses[currentGuess].triedFalse[toElim-1])
                    {
                        //if both have been tried we need to go back
                        guesses[currentGuess].triedFalse[abs(guesses[currentGuess].variable)-1]=0;
                        guesses[currentGuess].triedTrue[abs(guesses[currentGuess].variable)-1]=0;
                        currentGuess--;
                        if (DEBUG) printf("%s%d\n", "UNDOING GUESS: ", guesses[currentGuess].variable);

                        if(currentGuess<0)
                        {
                            return -1;
                        }

                        goBack(currentGuess);
                        return 0;
                    }
                    //negate variable
                    toElim=toElim*-1;
                }
            }
            else
            {
                int positiveToElim=abs(toElim);
                //Check if already tried false
                if(guesses[currentGuess].triedFalse[positiveToElim-1])
                {
                    //Check if already tried true
                    if(guesses[currentGuess].triedTrue[positiveToElim-1])
                    {
                        //if both have been tried we need to go back
                        currentGuess--;
                        if (DEBUG) printf("%s%d\n", "UNDOING GUESS: ", guesses[currentGuess].variable);
                        if(currentGuess<0)
                        {
                            return -1;
                        }
                        goBack(currentGuess);
                        return 0;

                    }
                    //negate variable
                    toElim=positiveToElim;
                }
            }
            break;
        }
    }
    if (DEBUG) printf("%s%d\n", "guessing variable: ",toElim);
    if(toElim == 0) {
        //error: no variables found
        return -1;
    }
    else {
        guesses[currentGuess].variable = toElim;
        guesses[currentGuess].addCount=0;
        guesses[currentGuess].cleanUpCount=0;
        guesses[currentGuess].unsatCount=0;
        for(int z=0; z<numClauses; z++)
        {
            guesses[currentGuess].cleanUps[z].addCount=0;
            guesses[currentGuess].cleanUps[z].unsatCount=0;
            guesses[currentGuess].cleanUps[z].cleanUpCount=0;
            guesses[currentGuess].cleanUps[z].variable=0;
        }
    }

    for(int i = 0; i < numClauses; i++) {

        if(clauses[i]->isSat)
        {
            //End of list
            break;
        }
        if(clauses[i]->variables[abs(toElim)-1]==0 )
        {
            continue;
        }
        else if(clauses[i]->variables[abs(toElim)-1]==toElim)
        {
            clauses[i]->isSat=1;
            clauses[i]->length=numVariables+1;
            guesses[currentGuess].clausesToUnsat[guesses[currentGuess].unsatCount]=clauses[i];
            guesses[currentGuess].unsatCount++;
        }
        else
        {
            clauses[i]->variables[abs(toElim)-1]=0;
            clauses[i]->length--;
            guesses[currentGuess].clausesToAddVar[guesses[currentGuess].addCount]=clauses[i];
            guesses[currentGuess].addCount++;
        }
    }
    if (DEBUG) printf("%s%d%s%d\n", "Sat clauses:",guesses[currentGuess].unsatCount," var removed clauses:",guesses[currentGuess].addCount);

    if(guesses[currentGuess].variable>0)
    {
        guesses[currentGuess].triedTrue[toElim-1]=toElim;
    }
    else
    {
        guesses[currentGuess].triedFalse[abs(toElim)-1]=toElim;
    }
    //If the variable we are trying doesn't satisfy anything then go back
    if(!guesses[currentGuess].unsatCount)
    {
        goBack(currentGuess);

        return 0;
    }

    sortClausesByLength(0,numClauses-1);
    if(!cleanHouse())
    {
        if (DEBUG) printf("%s\n", "Current guess is unsat. Going back.");
        goBack(currentGuess);

        return 0;
    }
    else
    {
        //check if sat
        if(clauses[0]->isSat)
            return 1;
        currentGuess++;
        guesses[currentGuess].addCount=0;
        guesses[currentGuess].cleanUpCount=0;
        guesses[currentGuess].unsatCount=0;
        for(int z=0; z<numClauses; z++)
        {
            guesses[currentGuess].cleanUps[z].addCount=0;
            guesses[currentGuess].cleanUps[z].cleanUpCount=0;
            guesses[currentGuess].cleanUps[z].variable=0;
        }
        for(int x=0; x<numVariables; x++)
        {
            guesses[currentGuess].triedTrue[x]=0;
            guesses[currentGuess].triedFalse[x]=0;
        }
    }
    return 0;
}