/******************************************************** * * * PROGRAM : master_mind SIS1.TN * * LANGUAGE: c * * Written by ZE OLIVEIRA 25:05:86 * * (C)Copyright 1986 ZARSOFT * * * *------------------------------------------------------* * WHAT: calcular chave de master-mind * * * *------------------------------------------------------* * HOW : * * * ********************************************************/ #include #include typedef struct {char chave[5]; int certos; int trocados; } data; #define limpa_buffer while('\n' != getchar()) /*-------------------------------------------------------------------*/ static void inicializar (data estado[]) { estado[0].certos=0; /* numero de chaves em consideracao */ estado[0].trocados=0; strcpy(estado[0].chave,"0000"); /* chave inicial */ } /*-----------------------------------------------------------------*/ static void escrever_ecran (data estado[]) { int i,count_data; count_data=estado[0].certos; i=1; puts("--------------------------------------------------------------------------------"); puts(" XXXX P B"); while (i <= count_data) {printf(" %s %d %d\n",estado[i].chave,estado[i].certos,estado[i].trocados); i++; } printf("actual: %s\ttotal: %d \n",estado[0].chave,estado[0].certos); } /*-------------------------------------------------------------------*/ static void acrescentar(data estado[]) { int count_data; count_data=(++estado[0].certos); printf("\nchave: "); gets(estado[count_data].chave); printf("\ncertos no sitio certo = "); scanf("%d",&estado[count_data].certos); printf("certos no sitio errado = "); scanf("%d",&estado[count_data].trocados); limpa_buffer; if (estado[count_data].certos<0 || estado[count_data].trocados<0) --estado[0].certos; } /*----------------------------------------------------------------*/ static int verificar (data estado[], int cont) {int certos,trocados; int i,j,livre; livre=estado[0].certos+1; strcpy(estado[livre].chave,estado[cont].chave); estado[livre].certos=estado[cont].certos; estado[livre].trocados=estado[cont].trocados; strcpy(estado[livre+1].chave,estado[0].chave); /*--- verificar certos ---*/ certos=0; for (i=0;i<4;i++) {if (estado[livre].chave[i] == estado[livre+1].chave[i]) {estado[livre].chave[i]=0; estado[livre+1].chave[i]=0; certos++; } } if (estado[livre].certos != certos) return(0); /*--- verificar trocados ---*/ trocados=0; for (i=0;i<4;i++) {if (estado[livre].chave[i] > 0) {for (j=0;j<4;j++) {if (estado[livre].chave[i] == estado[livre+1].chave[j]) {estado[livre].chave[i]=0; estado[livre+1].chave[j]=0; trocados++; break; /* saida=1 */ } } } } return(trocados == estado[livre].trocados); } /*------------------------------------------------------------------*/ static int incorrecta (data estado[]) { int i; int legal,count_data; legal=1; count_data=estado[0].certos; for (i=1;(i <= count_data) && legal;i++) legal=verificar(estado,i); return(!legal); } /*----------------------------------------------------------------*/ static int seguinte (data estado[]) { ++estado[0].chave[3]; if ( estado[0].chave[3]>'9') {estado[0].chave[3]='0'; ++estado[0].chave[2]; } if (estado[0].chave[2]>'9') {estado[0].chave[2]='0'; ++estado[0].chave[1]; } if (estado[0].chave[1]>'9') {estado[0].chave[1]='0'; ++estado[0].chave[0]; /* printf(" actual de pesquisa: %s\n",estado[0].chave); */ } if (estado[0].chave[0]>'9') return(1); else return(0); } /*----------------------------------------------------------------*/ static int calcular_chave_seguinte (data estado[]) {int fim; fim=0; while (incorrecta(estado) && !fim) fim=seguinte(estado); return(fim); } /*------------------------------------------------------------------*/ static int acrescentar_chave_calculada (data estado[]) { int count_data; int certo,trocado; escrever_ecran(estado); estado[0].certos++; count_data=estado[0].certos; strcpy(estado[count_data].chave,estado[0].chave); printf("\ncertos no sitio certo = "); scanf("%d",&certo); printf("certos no sitio errado = "); scanf("%d",&trocado); limpa_buffer; estado[count_data].certos=certo; estado[count_data].trocados=trocado; if (estado[count_data].certos<0 || estado[count_data].trocados<0) --estado[0].certos; return(certo == 4 || seguinte(estado)); } /*-------------------------------------------------------------------*/ static int calcular (data estado[]) {int fim1=0,fim2=0; fim1=calcular_chave_seguinte(estado); if (!fim1) fim2=acrescentar_chave_calculada(estado); return(fim1 || fim2); } /*-----------------------------------------------------------------*/ static void scan (data estado[]) {int fim; char bak[5]; int solucoes; fim=0; strcpy(bak,estado[0].chave); strcpy(estado[0].chave,"0000"); solucoes=0; while (!fim) {if (!incorrecta(estado)) {printf("%s\t",estado[0].chave); solucoes++;} fim=seguinte(estado); } strcpy(estado[0].chave,bak); printf("\ntotal de solucoes= %d\n",solucoes); } /*----------------------------------------------------------------*/ void main (void) { data estado[20]; char c; int fim=0; inicializar(estado); do {escrever_ecran(estado); puts("\n"); puts("----------------------------"); puts("\t1 - acrescentar informacoes"); puts("\t2 - calcular chave"); /* nao calcula se a actual conferir */ puts(""); printf("\n\t opcao: "); c=getchar(); limpa_buffer; switch (c) {case '1' :acrescentar(estado); puts("------------------------------"); scan(estado); break; case '2' :fim=calcular(estado); break; default :printf("error: opcao ilegal"); } } while (!fim); } /*----------------------------------------------------------------*/