int placeCol(int col, int num){ int i, j, test=0, empties=0; //find for(i=0;i<9;i++){ if(check(board[i][col],num) && !check(board[i][col],0)) return 0; if(check(board[i][col],0) && !check(notBoard[i][col],num) && !scanRow(i,num) && !scanBox((i/3)*3+col/3,num)) empties+=pow(2.0,i); } //place if(!empties) return -1; for(i=0;i<9;i++){ if(empties==pow(2.0,i)){ board[i][col]=pow(2.0,num); return 1; } } //eliminate remaining spaces in that box. if(empties<8){ for(i=0;i<3;i++){ for(j=(col/3)*3;j<(col/3+1)*3;j++){ if(j!=col && !check(notBoard[i][j],num)){ notBoard[i][j]+=pow(2.0,num); test=1; } } } if(test) return 1; } if(empties<64 && !(empties%8)){ for(i=3;i<6;i++){ for(j=(col/3)*3;j<(col/3+1)*3;j++){ if(j!=col && !check(notBoard[i][j],num)){ notBoard[i][j]+=pow(2.0,num); test=1; } } } if(test) return 1; } if(!(empties%64)){ for(i=6;i<9;i++){ for(j=(col/3)*3;j<(col/3+1)*3;j++){ if(j!=col && !check(notBoard[i][j],num)){ notBoard[i][j]+=pow(2.0,num); test=1; } } } if(test) return 1; } return 0; }
int UtilTransactions::verifyOrderedIndex(Ndb* pNdb, const NdbDictionary::Index* pIndex, int parallelism, bool transactional){ int retryAttempt = 0; const int retryMax = 100; int check; NdbScanOperation *pOp; NdbIndexScanOperation * iop = 0; NDBT_ResultRow scanRow(tab); NDBT_ResultRow pkRow(tab); NDBT_ResultRow indexRow(tab); const char * indexName = pIndex->getName(); int res; parallelism = 1; while (true){ if (retryAttempt >= retryMax){ g_info << "ERROR: has retried this operation " << retryAttempt << " times, failing!" << endl; return NDBT_FAILED; } pTrans = pNdb->startTransaction(); if (pTrans == NULL) { const NdbError err = pNdb->getNdbError(); if (err.status == NdbError::TemporaryError){ ERR(err); NdbSleep_MilliSleep(50); retryAttempt++; continue; } ERR(err); return NDBT_FAILED; } pOp = pTrans->getNdbScanOperation(tab.getName()); if (pOp == NULL) { ERR(pTrans->getNdbError()); closeTransaction(pNdb); return NDBT_FAILED; } if( pOp->readTuples(NdbScanOperation::LM_Read, 0, parallelism) ) { ERR(pTrans->getNdbError()); closeTransaction(pNdb); return NDBT_FAILED; } check = pOp->interpret_exit_ok(); if( check == -1 ) { ERR(pTrans->getNdbError()); closeTransaction(pNdb); return NDBT_FAILED; } if(get_values(pOp, scanRow)) { abort(); } check = pTrans->execute(NoCommit, AbortOnError); if( check == -1 ) { const NdbError err = pTrans->getNdbError(); if (err.status == NdbError::TemporaryError){ ERR(err); closeTransaction(pNdb); NdbSleep_MilliSleep(50); retryAttempt++; continue; } ERR(err); closeTransaction(pNdb); return NDBT_FAILED; } int eof; int rows = 0; while(check == 0 && (eof = pOp->nextResult()) == 0){ rows++; bool null_found= false; for(int a = 0; a<(int)pIndex->getNoOfColumns(); a++){ const NdbDictionary::Column * col = pIndex->getColumn(a); if (scanRow.attributeStore(col->getName())->isNULL()) { null_found= true; break; } } // Do pk lookup NdbOperation * pk = pTrans->getNdbOperation(tab.getName()); if(!pk || pk->readTuple()) goto error; if(equal(&tab, pk, scanRow) || get_values(pk, pkRow)) goto error; if(!null_found) { if(!iop && (iop= pTrans->getNdbIndexScanOperation(indexName, tab.getName()))) { if(iop->readTuples(NdbScanOperation::LM_CommittedRead, parallelism)) goto error; iop->interpret_exit_ok(); if(get_values(iop, indexRow)) goto error; } else if(!iop || iop->reset_bounds()) { goto error; } if(equal(pIndex, iop, scanRow)) goto error; } check = pTrans->execute(NoCommit, AbortOnError); if(check) goto error; if(scanRow.c_str() != pkRow.c_str()){ g_err << "Error when comapring records" << endl; g_err << " scanRow: \n" << scanRow.c_str().c_str() << endl; g_err << " pkRow: \n" << pkRow.c_str().c_str() << endl; closeTransaction(pNdb); return NDBT_FAILED; } if(!null_found) { if((res= iop->nextResult()) != 0){ g_err << "Failed to find row using index: " << res << endl; ERR(pTrans->getNdbError()); closeTransaction(pNdb); return NDBT_FAILED; } if(scanRow.c_str() != indexRow.c_str()){ g_err << "Error when comapring records" << endl; g_err << " scanRow: \n" << scanRow.c_str().c_str() << endl; g_err << " indexRow: \n" << indexRow.c_str().c_str() << endl; closeTransaction(pNdb); return NDBT_FAILED; } if(iop->nextResult() == 0){ g_err << "Found extra row!!" << endl; g_err << " indexRow: \n" << indexRow.c_str().c_str() << endl; closeTransaction(pNdb); return NDBT_FAILED; } } } if (eof == -1 || check == -1) { error: const NdbError err = pTrans->getNdbError(); if (err.status == NdbError::TemporaryError){ ERR(err); iop = 0; closeTransaction(pNdb); NdbSleep_MilliSleep(50); retryAttempt++; rows--; continue; } ERR(err); closeTransaction(pNdb); return NDBT_FAILED; } closeTransaction(pNdb); return NDBT_OK; } return NDBT_FAILED; }
int placeNum(void){ int i, j, num, result=0; for(i=0;i<9;i++){ for(j=0;j<9;j++){ for(num=1;num<=9;num++){ if(check(board[i][j],0) && !check(board[i][j],num) && !check(notBoard[i][j],num) && !scanRow(i,num) && !scanCol(j,num) && !scanBox((i/3)*3+j/3,num)){ board[i][j]+=pow(2.0,num); result=1; } else if(check(board[i][j],0) && check(board[i][j],num) && (check(notBoard[i][j],num) || scanRow(i,num) || scanCol(j,num) || scanBox((i/3)*3+j/3,num))){ board[i][j]-=pow(2.0,num); result=1; } } for(num=1;num<=9;num++){ if(board[i][j]==1) return -1; else if(board[i][j]==pow(2.0,num)+1){ board[i][j]--; result=1; } } } } return result; }
int placeBox(int box, int num){ int i, j, test=0, empties=0; //find for(i=0;i<3;i++){ for(j=0;j<3;j++){ if(check(board[(box/3)*3+i][(box%3)*3+j],num) && !check(board[(box/3)*3+i][(box%3)*3+j],0)) return 0; if(check(board[(box/3)*3+i][(box%3)*3+j],0) && !check(notBoard[(box/3)*3+i][(box%3)*3+j],num) && !scanRow((box/3)*3+i,num) && !scanCol((box%3)*3+j,num)) empties+=pow(2.0,3*i+j); } } //place if(!empties) return -1; for(i=0;i<3;i++){ for(j=0;j<3;j++){ if(empties==pow(2.0,3*i+j)){ board[(box/3)*3+i][(box%3)*3+j]=pow(2.0,num); return 1; } } } //eliminate remaining spaces in that row for(i=0,j=-1;i<9;i++){ if(check(empties,i)){ if(j==-1 || j==i/3) j=i/3; else{ j=-1; break; } } } if(j!=-1){ for(i=0;i<9;i++){ if(i/3!=box%3 && !check(notBoard[(box/3)*3+j][i],num)){ notBoard[(box/3)*3+j][i]+=pow(2.0,num); test=1; } } if(test) return 1; } //eliminate remaining spaces in that column for(i=0,j=-1;i<9;i++){ if(check(empties,i)){ if(j==-1 || j==i%3) j=i%3; else{ j=-1; break; } } } if(j!=-1){ for(i=0;i<9;i++){ if(i/3!=box/3 && !check(notBoard[i][(box%3)*3+j],num)){ notBoard[i][(box%3)*3+j]+=pow(2.0,num); test=1; } } if(test) return 1; } return 0; }
//does file input and guesses 'n checks int main(void){ int i, j, m, n, result, num, skip=0, guess=0, complete=0, guessList[81]={0}; FILE* puzzle; printf("About to overwrite 'enter_puzzle.txt'\n"); system("PAUSE"); puzzle=fopen("enter_puzzle.txt","w"); for(i=0;i<9;i++){ for(j=0;j<9;j++){ fprintf(puzzle,"0 "); if(j%3==2) fprintf(puzzle," "); } fprintf(puzzle,"\n"); if(i%3==2) fprintf(puzzle,"\n"); } fclose(puzzle); printf("\nLocate the file 'enter_puzzle.txt' and enter your puzzle.\n"); printf("Empty spaces should be left as 0. When done, click 'Save'.\n\n"); system("PAUSE"); puzzle=fopen("enter_puzzle.txt","r"); if(puzzle!=NULL){ for(i=0;i<9;i++){ for(j=0;j<9;j++) fscanf(puzzle,"%i",&board[i][j]); } fclose(puzzle); } else{ printf("\nError opening file.\n"); system("PAUSE"); return; } for(i=0;i<9;i++){ for(j=0;j<9;j++){ board[i][j]=pow(2.0,board[i][j]); notBoard[i][j]=1; } } result=solver(); if(result==1) printf("\nThe puzzle is complete! Open 'solution.txt'.\n\n"); if(result==-1) printf("\nThis puzzle is impossible.\n\n"); else{//guess and check while(!complete){ if(!skip) num=1; while(num<=9){ if(!skip) i=0; while(i<9){ if(!skip) j=0; while(j<9){ skip=0; if(check(board[i][j],0) && !check(notBoard[i][j],num) && !scanRow(i,num) && !scanCol(j,num) && !scanBox((i/3)*3+j/3,num)){ board[i][j]=pow(2.0,num); result=solver(); if(result==-1){ puzzle=fopen("enter_puzzle.txt","r"); for(m=0;m<9;m++){ for(n=0;n<9;n++){ fscanf(puzzle,"%i",&board[m][n]); board[m][n]=pow(2.0,board[m][n]); notBoard[m][n]=1; } } fclose(puzzle); solver(); for(guess=0;guessList[guess];guess++){ board[(guessList[guess]/10)%10][guessList[guess]%10]=pow(2.0,(guessList[guess]/100)%10); solver(); } } else if(result==1){ complete=1; num=10; i=9; j=9; } else{ guessList[guess]=num*100+i*10+j; printf("Guess %i: Place %i in row %i, column %i\n",guess,(guessList[guess]/100)%10,(guessList[guess]/10)%10+1,guessList[guess]%10+1); guess++; num=1; i=0; j=-1; } } j++; } i++; } num++; } if(guess && !complete){ guess--; printf("Undo guess %i\n",guess); num=(guessList[guess]/100)%10; i=(guessList[guess]/10)%10; j=guessList[guess]%10+1; skip=1; guessList[guess]=0; puzzle=fopen("enter_puzzle.txt","r"); for(m=0;m<9;m++){ for(n=0;n<9;n++){ fscanf(puzzle,"%i",&board[m][n]); board[m][n]=pow(2.0,board[m][n]); notBoard[m][n]=1; } } fclose(puzzle); solver(); for(guess=0;guessList[guess];guess++){ board[(guessList[guess]/10)%10][guessList[guess]%10]=pow(2.0,(guessList[guess]/100)%10); solver(); } } else break; } if(complete){ printf("\nThe puzzle is complete! Open 'solution.txt'.\n"); printf("Note: there may or may not be multiple solutions.\n\n"); } else printf("\nThis puzzle is impossible. Please disregard 'solution.txt'.\n\n"); } system("PAUSE"); return 0; }