Ir ao conteúdo

Caça Palavras, Olimpiada Brasileira da informatica


Sibelly

Posts recomendados

Postado

Hey galera.... estou com dificuldades para fazer esse exercicio...

http://olimpiada.ic.unicamp.br/pratique/programacao/nivel2/caca_palavras

Estou mandando o link.... não estou conseguindo nem ler a sequencia de palavras que eu dou como entrada... que no caso seria um vetor de strings né....

Agradeço desde já... ;)


# include <stdio.h>
# define MAX 50

int main (void){
int linhas, colunas, qnt_palavras, i, j;
char caca_palavras[MAX][MAX], palavra[MAX];

do{
printf ("\nInforme as linhas, colunas e a quantidade de palavras: \n");
scanf ("%d %d %d", &linhas, &colunas, &qnt_palavras);

}while ((linhas == 0) && (colunas == 0) && (qnt_palavras == 0));


printf ("\nInforme o caça palavras: \n");
for (i = 0; i < linhas; i++){
for (j = 0; j < colunas; j++){
scanf (" %c", &caca_palavras[i][j]);
}/* fim for j*/
}/* fim for i*/

printf ("\n Informe as palavras: \n");
for (i = 0; i < qnt_palavras; i++){
scanf ("%s\n", &palavra[i]);
}/* fim for i*/

// Estava testando... pedindo pra imprimir as palavras que dou de entrada... mas nao imprime...

printf ("\n\n\n\n\n");

for (i = 0; i < qnt_palavras; i++){
printf ("%s\n", palavra[i]);
}/* fim for i*/

return 0;
}





Postado

E ai galera... consegui ao menos fazer a leitura das palavras... agora é a parte chata... encontrar a palavra dada na matriz de caracteres (caça palavras).... Estou postando o que fiz... mas não está dando certo... '-'



# include <stdio.h>
# define MAX 100
# define TRUE 1
# define FALSE 0

int main (void){
int i, j, m, n, qunt_palavras, x, indice_linha, indice_coluna, cont, achou, z;
char matriz[MAX][MAX], aux[MAX][MAX], palavra[MAX][MAX];

//tamanho da matriz de caracteres (caça palavras)
scanf ("%d %d", &m, &n);

//le a matriz...
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
scanf (" %c", &matriz[i][j]);


//quantidade de palavras que se deseja procurar no caça palavras
scanf ("%d", &qunt_palavras);

//le cada palavra e armazena em um vetor de strings
for (i = 0; i < qunt_palavras; i++)
scanf ("%s", palavra[i]);


//Laço que seleciona cada palavra que sera procurada na matriz
for (z = 0; z < qunt_palavras; z++){

//Aqui eu uso uma variavel aux para receber a palavra....
strcpy (aux[z], palavra[z]);

//Percorre toda a matriz procurando a primeira letra da palavra selecionada.
for (i = 0; i < m; i++){
for (j = 0; j < n; j++){
if (aux[i][j] == matriz[i][j]){
indice_linha = i;
indice_coluna = j;
cont = 1;
achou = TRUE;

//Continua a verificação de caracteres iguais em todas as 8 direções.
for (x = 1; aux[x] != '\0'; x++){

if (aux[x] == matriz[i][j + cont]){
cont++;
}//fim if horizontal + 1

else if (aux[x] == matriz[i + cont][j]){
cont++;
}//fim else if vertical + 1

else if (aux[x] == matriz[i][j - cont]){
cont++;
}//fim else if horizontal - 1

else if (aux[x] == matriz[i - cont][j]){
cont++;
}//fim else if vertical - 1

else if (aux[x] == matriz[i - cont][j + cont]){
cont++;
}//fim else if diagonal superior direita

else if (aux[x] == matriz[i - cont][j - cont]){
cont++;
}//fim else if diagonal superior esquerda

else if (aux[x] == matriz[i + cont][j + cont]){
cont++;
}//fim else if diagonal inferior direita

else if (aux[x] == matriz[i + cont][j - cont]){
cont++;
}//fim else if diagonal inferior esquerda

else{
achou = FALSE;
break;
}//fim else

}//fim for x
}//fim if
}//fim for j
}//fim for i

if (achou)
printf ("A palavra %s existe\n", palavra[z]);

}//fim for z


return 0;
}


Quando compilo... aparecem uns trocentos avisos...


$ gcc teste.c -o teste -Wall -pedantic -std=c99
teste.c: Na função ‘main’:
teste.c:36:17: aviso: comparison between pointer and integer [habilitado por padrão]
teste.c:40:22: aviso: comparison between pointer and integer [habilitado por padrão]
teste.c:44:22: aviso: comparison between pointer and integer [habilitado por padrão]
teste.c:48:22: aviso: comparison between pointer and integer [habilitado por padrão]
teste.c:52:22: aviso: comparison between pointer and integer [habilitado por padrão]
teste.c:56:22: aviso: comparison between pointer and integer [habilitado por padrão]
teste.c:60:22: aviso: comparison between pointer and integer [habilitado por padrão]
teste.c:64:22: aviso: comparison between pointer and integer [habilitado por padrão]

Minha entrada...


3 6 //dimensões da matriz

1234TR
0CASRT
0XGTBK

2 // quantidade de palavras

CASA // palavra dada
SABAO

Saída....



A palavra casa existe -1218530779 -1216826768 // era para ser os indices em que a palavra começa.... Mas parece que nem está entrando no for.... '-'
A palavra sabao existe -1218530779 -1216826768

Se alguém puder ajudar.... agradeço... ;)

Postado

O erro está aqui:

aux[x] != '\0'

Por partes:

- A variável aux é um vetor de vetores de caracteres. Logo, seu tipo é char[][].

- Ao dereferenciar a variável aux com o operador [], seu tipo vira char[], que equivale a um ponteiro constante para char.

- O operador ' ' realiza uma conversão do caractere \0 para um inteiro.

- No fim, você tem uma comparação de um ponteiro para um inteiro.

P.S.: O mesmo erro de comparação entre tipos diferentes ocorre nas comparações abaixo.

Postado


# include <stdio.h>
# include <string.h>
# define MAX 50
# define TRUE 1
# define FALSE 0

/* Recebe os indices da matriz e retorna a posiçao positiva caso seja negativa. */
int verifica_sinal (int i, int j){
if ((i - j) < 0)
return (i - j) * -1;
else
return (i - j);
}/* fim função verifica_sinal */

int main (void){
int linhas, colunas, i, j, qunt_palavras, x, indice_linha, indice_coluna, cont, achou, z, posicao, resposta[MAX * MAX][3];
char matriz[MAX][MAX] = {{' '},{' '}}, aux[MAX][MAX], palavra[MAX][MAX];


do{
printf ("\nInforme as linhas, colunas e a quantidade de palavras: \n");
scanf ("%d %d %d", &linhas, &colunas, &qunt_palavras);


printf ("\nInforme o caça palavras: \n");
for (i = 0; i < linhas; i++){
for (j = 0; j < colunas; j++){
scanf (" %c", &matriz[i][j]);
}/* fim for j*/
}/* fim for i*/

printf ("\n Informe as palavras: \n");
for (i = 0; i < qunt_palavras; i++){
scanf ("%s", palavra[i]);
}/* fim for i*/

printf ("\n\n\n\n\n");

for (z = 0; z < qunt_palavras; z++){
strcpy (aux[z], palavra[z]);

/*Percorre toda a matriz procurando a primeira letra da palavra selecionada.*/
for (i = 0; i < linhas; i++){
for (j = 0; j < colunas; j++){
if (aux[z][0] == matriz[i][j]){
cont = 1;
achou = TRUE;

/*Continua a verificação de caracteres iguais em todas as 8 direções.*/
for (x = 1; aux[z][x] != '\0'; x++){

posicao = FALSE; /* variavel que volta a posicao caso as 8 direcoes nao sejam verdade */
printf ("For x = %c\n", aux[z][x]);

if (aux[z][x] == matriz[i][j + cont]){
printf ("Horizontal + 1 palavra= %c, matriz= %c, cont= %d, i = %d, j = %d, x = %d\n", aux[z][x], matriz[i][j + cont], cont, i, j, x);
cont++;
posicao = TRUE;
}/*fim if horizontal + 1 */

else if (aux[z][x] == matriz[i + cont][j]){
printf ("Vertical + 1 palavra= %c, matriz= %c, cont= %d, i = %d, j = %d, x = %d\n", aux[z][x], matriz[i + cont][j], cont, i, j, x);
cont++;
posicao = TRUE;
}/*fim else if vertical + 1 */

else if (aux[z][x] == matriz[i][(verifica_sinal(cont,j))]){
printf ("Horizontal - 1 palavra= %c, matriz= %c, cont= %d, i = %d, j = %d, x = %d\n", aux[z][x], matriz[i][cont - j], cont, i, j, x);
cont++;
posicao = TRUE;
}/*fim else if horizontal - 1 */

else if (aux[z][x] == matriz[(verifica_sinal(cont,i))][j]){
printf ("Vertical - 1 palavra= %c, matriz= %c, cont= %d, i = %d, j = %d, x = %d\n", aux[z][x], matriz[cont - i][j], cont, i, j, x);
cont++;
posicao = TRUE;
}/*fim else if vertical - 1 */

else if (aux[z][x] == matriz[(verifica_sinal(cont,i))][j + cont]){
printf ("Superior direita palavra= %c, matriz= %c, cont= %d, i = %d, j = %d, x = %d\n", aux[z][x], matriz[cont - i][j + cont], cont, i, j, x);
cont++;
posicao = TRUE;
}/*fim else if diagonal superior direita */

else if (aux[z][x] == matriz[(verifica_sinal(cont,i))][(verifica_sinal(cont,j))]){
printf ("Superior Esquerda palavra= %c, matriz= %c, cont= %d, i = %d, j = %d, x = %d\n", aux[z][x], matriz[cont - i][cont - j], cont, i, j, x);
cont++;
posicao = TRUE;
}/*fim else if diagonal superior esquerda */

else if (aux[z][x] == matriz[i + cont][j + cont]){
printf ("Inferior direita palavra= %c, matriz= %c, cont= %d, i = %d, j = %d, x = %d\n", aux[z][x], matriz[i + cont][j + cont], cont, i, j, x);
cont++;
posicao = TRUE;
}/*fim else if diagonal inferior direita */

else if (aux[z][x] == matriz[i + cont][(verifica_sinal(cont,j))]){
printf ("Inferior Esquerda palavra= %c, matriz= %c, cont= %d, i = %d, j = %d, x = %d\n", aux[z][x], matriz[i + cont][cont - j], cont, i, j, x);
cont++;
posicao = TRUE;
}/*fim else if diagonal inferior esquerda */

else if (posicao == FALSE){
cont--;
x--;
}/*fim else if */

else{
achou = FALSE;
break;
}/* fim else */

}/*fim for x */

.................................................
if (achou){
indice_linha = i;
indice_coluna = j; // Nao sei direito onde colocar esse trecho para que ele pegue as posições apenas quando TODA a palavra for encontrada.... pois ele esta armazenando até as posições de quando APENAS a primeira letra da palavra é igual a algum caracter da matriz....
}/* fim if */
......................................................

}/*fim if */
}/*fim for j */
}/*fim for i */


if (achou)
resposta[] = TRUE;
else
resposta[] = FALSE;


}/*fim for z */



for ( // estou pensando em criar um vetor... para armazenar as respostas e as posições.....



}while ((linhas == 0) && (colunas == 0) && (qunt_palavras == 0));




return 0;
}

Galera... avancei bastante.... agora consigo identificar as palavras em todas as posições certinho....

Agora só falta arrumar a saída de acordo com a saída padrão do exercicio.... estou tendo dificuldades...

E também nao estou conseguindo pegar as posições iniciais da palavra... se alguem puder dar uma força....

Esta com esses printf's apenas para me orientar melhor....

;)

Postado

Bem galera.... eu tentei o máximo que pude... faltou muito ainda... mas estou mandando o meu código... as entradas... e a minha sáida....



# include <stdio.h>
# include <string.h>
# define MAX 50
# define TRUE 1
# define FALSE 0

/* Recebe os indices da matriz e retorna a posiçao positiva caso seja negativa. */
int verifica_sinal (int i, int j){
if ((i - j) < 0)
return (i - j) * -1;
else
return (i - j);
}/* fim função verifica_sinal */

int main (void){
int linhas = 1, colunas = 1, i, j, qunt_palavras = 1, x, indice_linha[MAX * MAX], indice_coluna[MAX * MAX], cont, achou, z, posicao;
int resposta[MAX * MAX], teste = 0, y, w;
char matriz[MAX][MAX] = {{' '},{' '}}, aux[MAX][MAX], palavra[MAX][MAX];


while ( (linhas != 0) && (colunas != 0 ) && (qunt_palavras != 0)){

scanf ("%d %d %d", &linhas, &colunas, &qunt_palavras);

if ( (linhas == 0) && (colunas == 0 ) && (qunt_palavras == 0) )
return 0;

for (i = 0; i < linhas; i++){
for (j = 0; j < colunas; j++){
scanf (" %c", &matriz[i][j]);
}/* fim for j*/
}/* fim for i*/

for (i = 0; i < qunt_palavras; i++){
scanf ("%s", palavra[i]);
}/* fim for i*/

achou = FALSE;
y = 0;

/* Percorre todas as palavras */
for (z = 0; z < qunt_palavras; z++){
strcpy (aux[z], palavra[z]);

/*Percorre toda a matriz procurando a primeira letra da palavra selecionada.*/
for (i = 0; i < linhas; i++){
for (j = 0; j < colunas; j++){
if (aux[z][0] == matriz[i][j]){
cont = 0;
achou = TRUE;

/*Continua a verificação de caracteres iguais em todas as 8 direções.*/
for (x = 1; aux[z][x] != '\0'; x++){

posicao = FALSE; /* variavel que volta uma posicao caso as 8 direcoes nao sejam verdade */

if (aux[z][x] == matriz[i][j + cont]){
++cont;
posicao = TRUE;
}/*fim if horizontal + 1 */

else if (aux[z][x] == matriz[i + cont][j]){
++cont;
posicao = TRUE;
}/*fim else if vertical + 1 */

else if (aux[z][x] == matriz[i][(verifica_sinal(cont,j))]){
++cont;
posicao = TRUE;
}/*fim else if horizontal - 1 */

else if (aux[z][x] == matriz[(verifica_sinal(cont,i))][j]){
++cont;
posicao = TRUE;
}/*fim else if vertical - 1 */

else if (aux[z][x] == matriz[(verifica_sinal(cont,i))][j + cont]){
++cont;
posicao = TRUE;
}/*fim else if diagonal superior direita */

else if (aux[z][x] == matriz[(verifica_sinal(cont,i))][(verifica_sinal(cont,j))]){
++cont;
posicao = TRUE;
}/*fim else if diagonal superior esquerda */

else if (aux[z][x] == matriz[i + cont][j + cont]){
++cont;
posicao = TRUE;
}/*fim else if diagonal inferior direita */

else if (aux[z][x] == matriz[i + cont][(verifica_sinal(cont,j))]){
++cont;
posicao = TRUE;
}/*fim else if diagonal inferior esquerda */

else if (posicao == FALSE){
cont--;
x--;
}/*fim else if */

else{
achou = FALSE;
posicao = FALSE;
break;
}/* fim else */

}/*fim for x */

if (achou){
resposta[y] = TRUE;
indice_linha[y] = i + 1;
indice_coluna[y] = j + 1;
y++;
}/* fim if */
else{
resposta[y] = FALSE;
y++;
}/* fim else */

}/*fim if */
}/*fim for j */
}/*fim for i */
}/*fim for z */

teste++;

printf ("Teste %d\n", teste);
for (w = 0; w < y; w++){
if (resposta[w])
printf ("%s: linha %d, coluna %d\n", palavra[w], indice_linha[w], indice_coluna[w]);
else
printf ("%s: nao encontrado\n", palavra[w]);
}/* Fim for impressao das respostas */

} /* Fim while */

return 0;
}

Entrada


8 11 8
abcdefghigg
hebkwaldork
ftyawaldorm
ftsimrlqsrc
byoarbedeyv
klcbqwikomk
strebgadhrb
yuiqlxcnbjf
waldorf
bambi
betty
paralelepipedo
dagbert
frod
rebelde
amarrar

20 20 13
QWSPILAATIRAGRAMYKEI
AGTRCLQAXLPOIJLFVBUQ
TQTKAZXVMRWALEMAPKCW
LIEACNKAZXKPOTPIZCEO
FGKLSTCBTROPICALBLBC
JEWHJEEWSMLPOEKORORA
LUPQWRNJOAAGJKMUSJAE
KRQEIOLOAOQPRTVILCBZ
QOPUCAJSPPOUTMTSLPSF
LPOUYTRFGMMLKIUISXSW
WAHCPOIYTGAKLMNAHBVA
EIAKHPLBGSMCLOGNGJML
LDTIKENVCSWQAZUAOEAL
HOPLPGEJKMNUTIIORMNC
LOIUFTGSQACAXMOPBEIO
QOASDHOPEPNBUYUYOBXB
IONIAELOJHSWASMOUTRK
HPOIYTJPLNAQWDRIBITG
LPOINUYMRTEMPTMLMNBO
PAFCOPLHAVAIANALBPFS
MARGARITA
ALEMA
BARBECUE
TROPICAL
SUPREMA
LOUISIANA
CHEESEHAM
EUROPA
HAVAIANA
CAMPONESA
POTE
TROPICO
MONGOL
0 0 0

Saída


Teste 1
waldorf: linha 2, coluna 5
bambi: linha 3, coluna 5
betty: linha 6, coluna 6
paralelepipedo: linha 1, coluna 2
dagbert: linha 2, coluna 3
frod: linha 5, coluna 1
rebelde: linha 5, coluna 6
amarrar: linha 6, coluna 4
: linha 7, coluna 5
: linha 7, coluna 11
XȈ��ؿ��ؿ@N��: linha 8, coluna 9
: linha 1, coluna 2
: linha 2, coluna 3
��XȈ�����8�: linha 5, coluna 1
8Ȉ�: linha 5, coluna 6
: linha 6, coluna 4
: linha 7, coluna 5
��: linha 7, coluna 11
lb��: linha 8, coluna 9
��: linha 1, coluna 4
�Q�
�EoP: linha 2, coluna 8
����B���L�: linha 3, coluna 8
ؿ: linha 5, coluna 8
: linha 7, coluna 8
: linha 1, coluna 6
: linha 3, coluna 1
$,: linha 4, coluna 1
: linha 8, coluna 11
: linha 2, coluna 10
: linha 3, coluna 10
: linha 4, coluna 6
��: linha 4, coluna 10
�ؿˈ� : linha 5, coluna 5
l�0: linha 7, coluna 3
: linha 7, coluna 10
��: linha 1, coluna 1
��m��刷(ؿ: linha 2, coluna 6
: linha 3, coluna 4
^8n��N���: linha 3, coluna 6
��: linha 5, coluna 4
<���: linha 7, coluna 7


Falha de segmentação (imagem do núcleo gravada)


Se alguém achar alguma coisa pra me ajudar.... agradeço... ;)

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!