コード例 #1
0
ファイル: sudoku.c プロジェクト: RyanCotsakis/Sudoku
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;
}
コード例 #2
0
ファイル: UtilTransactions.cpp プロジェクト: 4T-Shirt/mysql
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;
}
コード例 #3
0
ファイル: sudoku.c プロジェクト: RyanCotsakis/Sudoku
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;
}
コード例 #4
0
ファイル: sudoku.c プロジェクト: RyanCotsakis/Sudoku
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;	
}
コード例 #5
0
ファイル: sudoku.c プロジェクト: RyanCotsakis/Sudoku
//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;
}