コード例 #1
0
ファイル: freecell.c プロジェクト: StanleySathler/university
/*****************************************************************************
 * Le caractere por caractere no arquivo, fazendo toda 
 * a logica necessaria para insercao nas pilhas
*****************************************************************************/
int leArquivoConfigurandoPilhas(Pilha* pilhas[], FILE *arquivo, unsigned short int linhaInicial, unsigned short int linhaFinal, unsigned short int tamLinha){
  // Linha do arquivo = coluna no jogo.
  // 3 colunas no arquivo = carta (linha) no jogo.
  unsigned int short linha, coluna;

  for(linha = linhaInicial-1; linha < linhaFinal; linha++){
    for(coluna = 0; coluna < tamLinha; coluna++){
      char numeroCarta[2];
      char naipeCarta;

      numeroCarta[0] = fgetc(arquivo);
      coluna++;

      if((int)numeroCarta[0] > 64){
        if(numeroCarta[0] == 'A'){
          numeroCarta[0] = '0';
          numeroCarta[1] = '1';
          coluna++;
        }
        else if(numeroCarta[0] == 'J'){
          numeroCarta[0] = '1';
          numeroCarta[1] = '1';
          coluna++;
        }
        else if(numeroCarta[0] == 'Q'){
          numeroCarta[0] = '1';
          numeroCarta[1] = '2';
          coluna++;
        }
        else if(numeroCarta[0] == 'K'){
          numeroCarta[0] = '1';
          numeroCarta[1] = '3';
          coluna++;
        }
      } else {
        numeroCarta[1] = fgetc(arquivo);
        coluna++;
      }

      naipeCarta = fgetc(arquivo);

      Carta carta = criaCarta((unsigned short int)atoi(numeroCarta), naipeCarta);
      inserePilha(pilhas[linha], carta);
    }

    // Essas duas lidas ridiculas sao para consumir o '\n' 
    // e o '\0' do final de cada linha
    char nada;
    nada = fgetc(arquivo);

    // Porem, o '\0' aparentemente so existe no Linux, entao 
    // no Windows nao eh necessario ler duas vezes
    #ifndef __WIN32
      nada = fgetc(arquivo);
    #endif
  }
}
コード例 #2
0
ファイル: freecell.c プロジェクト: StanleySathler/university
/*****************************************************************************
 * Movimenta uma carta de [W-Z] para [A-H]
 *****************************************************************************/
void movimentaSuperiorEsquerdaParaNormal(Carta cartasSuperiorEsquerda[], Pilha* pilhasNormais[], unsigned short int indiceColunaOrigem, unsigned short int indiceColunaDestino, char mensagemErro[], unsigned short int *jogadaJogador){
  Carta cartaColunaOrigem = cartasSuperiorEsquerda[indiceColunaOrigem];
  unsigned short int corCartaColunaOrigem = checaCorNaipe(cartaColunaOrigem.naipe);

  Carta cartaColunaDestino = topoPilha(pilhasNormais[indiceColunaDestino]);
  unsigned short int corCartaColunaDestino = checaCorNaipe(cartaColunaDestino.naipe);

  if(corCartaColunaDestino != corCartaColunaOrigem){
    if(cartaColunaOrigem.numero == cartaColunaDestino.numero-1 || pilhasNormais[indiceColunaDestino]->qntd == 0){
      inserePilha(pilhasNormais[indiceColunaDestino], cartasSuperiorEsquerda[indiceColunaOrigem]);
      inicializaCartaComValorPadrao(&(cartasSuperiorEsquerda[indiceColunaOrigem]));
      (*jogadaJogador)++;
    } else {
      strcpy(mensagemErro, "Voce so pode agrupar cartas em ordem decrescente.");
    }
  } else{
    strcpy(mensagemErro, "Voce so pode agrupar cartas cujos naipes tenham cores diferentes.");
  }
}
コード例 #3
0
ファイル: freecell.c プロジェクト: StanleySathler/university
/*****************************************************************************
 * Movimenta uma carta de [A-H] para [0-3]
 *****************************************************************************/
void movimentaNormalParaSuperiorDireita(Pilha* pilhasNormais[], Pilha* pilhasSuperiorDireita[], unsigned short int indiceColunaOrigem, unsigned short int indiceColunaDestino, char mensagemErro[], unsigned short int *jogadaJogador, unsigned short int *colunasFormadas){
  Carta cartaColunaOrigem = topoPilha(pilhasNormais[indiceColunaOrigem]);
  Carta cartaColunaDestino = topoPilha(pilhasSuperiorDireita[indiceColunaDestino]);

  if(cartaColunaOrigem.naipe == cartaColunaDestino.naipe || pilhasSuperiorDireita[indiceColunaDestino]->qntd == 0){

    if(cartaColunaOrigem.numero == cartaColunaDestino.numero+1 || pilhasSuperiorDireita[indiceColunaDestino]->qntd == 0 && cartaColunaOrigem.numero == 1){
      (*jogadaJogador)++;
      inserePilha(pilhasSuperiorDireita[indiceColunaDestino], cartaColunaOrigem);
      removePilha(pilhasNormais[indiceColunaOrigem]);

      if(cartaColunaOrigem.numero == MAIOR_VALOR_CARTA){
        colunasFormadas++;
      }

    } else {
      strcpy(mensagemErro, "Nas colunas [0-3], voce so pode agrupar cartas em ordem crescente.");
    }
  } else {
    strcpy(mensagemErro, "Nas colunas [0-3], as cartas precisam ser sempre do mesmo naipe.");
  }
}
コード例 #4
0
ファイル: freecell.c プロジェクト: StanleySathler/university
/*****************************************************************************
 * Movimenta uma carta de [W-Z] para [0-3]
 *****************************************************************************/
void movimentaSuperiorEsquerdaParaSuperiorDireita(Carta cartasSuperiorEsquerda[], Pilha* pilhasSuperiorDireita[], unsigned short int indiceColunaOrigem, unsigned short int indiceColunaDestino, char mensagemErro[], unsigned short int *jogadaJogador, unsigned short int *colunasFormadas){
  Carta cartaColunaOrigem = cartasSuperiorEsquerda[indiceColunaOrigem];
  Carta cartaColunaDestino = topoPilha(pilhasSuperiorDireita[indiceColunaDestino]);

  if(cartaColunaOrigem.naipe == cartaColunaDestino.naipe || pilhasSuperiorDireita[indiceColunaDestino]->qntd == 0){
    if(cartaColunaOrigem.numero == cartaColunaDestino.numero+1 || pilhasSuperiorDireita[indiceColunaDestino]->qntd == 0 && cartaColunaOrigem.numero == 1){
      inserePilha(pilhasSuperiorDireita[indiceColunaDestino], cartaColunaOrigem);
      inicializaCartaComValorPadrao(&(cartasSuperiorEsquerda[indiceColunaOrigem]));
      (*jogadaJogador)++;

      // Se a carta a ser inserida eh a ultima (13), entao a coluna esta formada
      if(cartaColunaOrigem.numero == MAIOR_VALOR_CARTA){
        colunasFormadas++;
      }

    } else {
      strcpy(mensagemErro, "Nas colunas [0-3], voce so pode agrupar cartas em ordem crescente.");
    }
  } else {
    strcpy(mensagemErro, "Nas colunas [0-3], as cartas precisam ser sempre do mesmo naipe.");
  }
}
コード例 #5
0
void coloracaoGulosa(Grafo g, int k)
{
	/*Cria um grafo de backup*/
	GBsalvaGrafo(g,"guardaGrafo.txt");
	Grafo grafo = GGcarregaGrafo("guardaGrafo.txt");
	remove("guardaGrafo.txt");

	/*Declaracao de variaveis e EDs*/
	int i, corVizinho, vertice, menorGrau, aresta, encontrouMenor,menorCor, verticeVizinho, tamanho = GInumeroVertices(grafo);
	Pilha pilha = criaPilha();
	VetVertice vertices = (VetVertice) malloc(sizeof(struct vetVertice)*tamanho);
	vertice = GVprimeiroVertice(grafo);
	/*Colore como neutro todos os vertices*/
	vertices[0].idVertice = vertice;
	vertices[0].cor = 0;
	for(i = 1; i < tamanho; i++)
	{
		vertices[i].idVertice = GVproximoVertice(grafo,vertice);
		vertices[i].cor = 0;
		vertice = GVproximoVertice(grafo,vertice);
	}

	/*Definicao da ordem de coloracao*/
	while(GInumeroVertices(grafo) != 0)
	{
		menorGrau = INT_MAX;
		for(i = GVprimeiroVertice(grafo); i != 0; i = GVproximoVertice(grafo,i))
		{
			if(GIpegaGrau(grafo,i) < menorGrau)
			{
				menorGrau = GIpegaGrau(grafo,i);
				vertice = i;
			}
		}
		GVdestroiVertice(grafo,vertice);
		inserePilha(pilha,vertice);
	}
	GGdestroiGrafo(grafo);

	/*Colore os vertices*/
	while(!vaziaPilha(pilha))
	{
		vertice = retirarPilha(pilha);
		if(GIpegaGrau(g,vertice) >= k)
		{
			printf("Não existe solução\n");
			return;
		}
		encontrouMenor = 0;
		menorCor = 1;
		int achouIgual = 0;
		while(!encontrouMenor)
		{
			achouIgual = 0;
			for(aresta = GAprimaAresta(g,vertice); aresta != 0; aresta = GAproxAresta(g,vertice,aresta))
			{
				verticeVizinho = GVvizinho(g,aresta,vertice);
				corVizinho = pegaCorVertice(vertices,tamanho,verticeVizinho);
				if(menorCor == corVizinho)
				{
					achouIgual = 1;
				}
			}
			if(achouIgual)
			{
				menorCor++;
			}
			else
			{
				encontrouMenor = 1;
			}
		}
		coloreVertice(vertices,tamanho,vertice,menorCor);
	}

	for(i = 0; i < tamanho; i++)
	{
		printf("Vertice %d possui a cor %d\n", vertices[i].idVertice, vertices[i].cor);
	}
}
コード例 #6
0
void infixToPostfix(char expr[], Pilha *p, char post[]) {
    int i = 0;
    int count = 0;
    int abriuParentesis = 0; // flag para indicar se abriu parentesis
     
    // limpar o post
    post[0] = '\0';
     
    // para evitar: a+b+
    char ultimo = expr[strlen(expr) - 1];
     
     
    // Garante que a string possui somente caracteres validos
    i = 0;
    while (i < MAX && expr[i] != '\0' && expr[i] != '\n') {
        if (!operadorValido(expr[i])) {
            strcpy(post,"Lexical Error!");
            return;
        }
        i++;
    }
     
    i = 0;
    while (i < MAX && expr[i] != '\0' && expr[i] != '\n') {
        // do infix to postfix
        if (simbolo(expr[i])) {
             
            // para evitar: aa+bb, a(b+c)
            if (i+1 != MAX && (simbolo(expr[i + 1]) || expr[i + 1] == '(')) {
                strcpy(post,"Syntax Error!");
                return;
            }
             
            // concatena o na string posfixa
            post[count] = expr[i];
            post[count + 1] = '\0';
            count++;
        } else {
             
            // para evitar: a++b
            if (expr[i]=='(' && !simbolo(expr[i+1]) || (expr[i]!='(' && expr[i]!=')') && (expr[i+1]!='(' && expr[i+1]!=')') && !simbolo(expr[i+1]) ) {
                strcpy(post,"Syntax Error!");
                return;
            }
             
            if (pilhaVazia(p) || expr[i]=='(' || abriuParentesis) {
                inserePilha(p, expr[i]);
                abriuParentesis = expr[i] == '(' ? 1 : 0;
            } else if (expr[i] == ')') {
                while (!pilhaVazia(p) && topo(p) != '(') {
                    // remove da pilha e insere na string
                    post[count] = removePilha(p);
                    post[count + 1] = '\0';
                    count++;
                }
                 
                // caso encontre o '(' remove da pilha
                if (pilhaVazia(p)) {
                    strcpy(post,"Syntax Error!");
                    return;
                } else {
                    removePilha(p);
                    abriuParentesis = 0;
                }
             
            } else {
                if (temPrecedencia(topo(p), expr[i])) {
                    do {
                        post[count] = removePilha(p);
                        post[count + 1] = '\0';
                        count++;
                    } while (!pilhaVazia(p) && temPrecedencia(topo(p), expr[i]));
                   
                    inserePilha(p, expr[i]);
                } else {
                    inserePilha(p, expr[i]);
                }
            } 
        }
        i++;
    } 
     
    if (operadorValido(ultimo) && !simbolo(ultimo) && ultimo != ')') {
        strcpy(post,"Syntax Error!");
        return;
    }
     
    while(!(pilhaVazia(p))) {
        post[count] = removePilha(p);
        post[count + 1] = '\0';
        count++;
    }
     
    // verifica se faltou fechar algum parentesis
    for (i = 0; i < count; i++) {
        if (post[i] == '(') {
            strcpy(post,"Syntax Error!");
            return;
        }
    }
}