Codigo com erro; Exercicio da OBI(Oil Deposits)

1. Codigo com erro; Exercicio da OBI(Oil Deposits)

Eduardo
ehammo

(usa Ubuntu)

Enviado em 15/04/2014 - 22:25h

Oi gente, ccomecei a programar em C a 2 dias. Mas ja perguntei a uns colegas e ninguem sabe me dizer por que ta errado. Meu professor so ensina java e perguntar a ele durante a aula atraza o assunto. será que vcs podem me ajudar? este é o link da questao: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=sh...

e este é o meu codigo

#include <bits/stdc++.h>
using namespace std;
//declaro matriz principal
char array[105][105];
//declaro uma matriz secundária correspondente a principal, com todos os valores F/T
bool tem[105][105];
//declaro variaveis r(row ou linha), c(colunas), oleo(nmero de pocos de petroleo)
int r,c,oleo,cont;
//crio 2 arrays ja preenchidos com os numeros que eu preciso somar a linha/coluna de um elemento para ter seus(no máximo 8) vizinhos
int dr[8] = {1, 1, 1, 0, -1, -1, 0};
int dc[8] = {0, -1, 1, 1, -1, 1, -1};
//crio uma funcao que posteriormente servira para eu validar se os vizinhos existem ou nao(um elemento pode ter entre 0-8 vizinhos)
bool valid(int x, int y) {
return (x>=0 && y>=0 && x<r && y<c);
}
int main(){
//escaneio as variaveis que formam a matriz
while (scanf("%d %d", &r, &c) == 2 && r != 0 && c!=0) {
//digo que a matriz secundaria `tem` eh preenchida so com falsos e que oleo=0 no comeco
memset(tem,false,sizeof tem);
oleo = 0;
//leio a matriz
for (int i=0;i<r;i++){
for(int j=0; j<c;j++){
scanf("%c", &array[i][j]);
}
}
//leio cada elemento da matriz principal.
//por motivos de organizacao chamarei este elemento na matriz principal de ep
for (int i=0;i<r;i++){
for(int j=0; j<c;j++){
//caso ep = @ faca
if (array[i][j]=='@'){
//leia cada vizinho possivel de ep
if (cont<100){
for (int k=0;k<8;k++){
int nr = i+dr[k];
int nc = j+dc[k];
//este vizinho existe ?
if(valid(nr,nc)){
//por motivos de organizacao chamarei este elemento vizinho de ev
//se ele exite ele eh um @?
if(array[nr][nc]=='@'){
//entao ev eh um @. Mas ev ta marcado como True no seu elemento correspondente na matriz secundaria?
if (tem[nr][nc]==true){
//entao marque o elemento correspondente a ep como true
tem[i][j]=true;
cont++;
}
}
}
}
}
//o elemento ep eh falso?
if (tem[i][j]== false){
if (cont==100){
cont=0;
}
tem[i][j]=true;
oleo++;
cont++;
for (int k=0;k<8;k++){
int nr = i+dr[k];
int nc = j+dc[k];
if(valid(nr,nc)){
if(array[nr][nc]=='@'){
if (tem[nr][nc]== false){
tem[nr][nc]=true;
cont++;
}
}
}
}
}
}
}
}
printf("%d\n", oleo);
}
return 0;
}



ele antes tava funcionando perfeitamente, caso um usuario digitasse a matriz. mas como era um pc(quando compila compila g++ nome.cpp, e executa executa como \.a < in sendo in a entrada)
ai dava [*****].Meu amigo me disse pra eu alterar o meu jeito de ler a matriz. [tava lendo cada linha como uma string: "for (int i=0;i<r;i++){ scanf("%s", array[i]); }" ] dai agr nem funciona como usuario nem como pc.




  


2. Re: Codigo com erro; Exercicio da OBI(Oil Deposits)

Paulo
paulo1205

(usa Ubuntu)

Enviado em 17/04/2014 - 12:37h

Durante a leitura, você faz o seguinte.

for(int i=0;i<r;i++){
for(int j=0; j<c;j++){
scanf("%c", &array[i][j]);
}
}


Acredito que isso seja parte do problema. A conversão “%c” não pula espaços em branco e quebras de linhas, de modo que você pode estar lendo coisas inválidas para dentro da matriz.

Para corrigir, é muito fácil.

for(int i=0;i<r;i++){
for(int j=0; j<c;j++)
scanf("%c", &array[i][j]);
scanf(" "); // um espaço em branco, para absorver a quebra de linha
}


Ou, ainda, lendo a linha inteira:

for(i=0; i<r; i++)
fgets(array[i], sizeof array[i], stdin);


Se você pensar bem, vai notar que não precisa armazenar a matriz inteira: você só precisa ter na memória a linha corrente e a linha anterior, e pode já ir calculando com precisão a quantidade de bolsões de óleo na medida em que, após ler a linha corrente, percorrer os elementos no sentido oeste->leste, comparando cada um com o que está a oeste, noroeste, norte e nordeste, nesta ordem, e fazendo as devidas adições ou subtrações.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts