Bonjour tout le monde. (j'suis un nouveau, pour les gars du fond qui n'ont pas remarqué o) )
Eh bien avant même d'exposer mon problème, j'ai une chtite question : normal que je ne puisse plus accéder directement aux exercices d'entraînement à partir de l'instant où je poste ici ? Parce-que ça m'emmerde un peu, sans vouloir être grossier. o_o
Ensuite pour mon problème en question : j'ai réfléchi pendant la nuit (20mn en fait xD ) pour un algorithme potable,
j'ai eu l'idée de marquer à '2' toutes les cases "océan" (sachant que 0 = eau, 1 = terre) avec une fonction récursive
partant de la case en haut à gauche (puisqu'elle est nécessairement une case d'océan selon l'énoncé) et parcourant la
carte de case en case en tenant compte des diagonales.
Ceci fait, je vérifie chaque case de terre si elle a une case océan adjacente, en incrémentant un compteur. Je ne pense
pas que cette méthode ait une faille, pourtant le correcteur automatique n'apprécie pas vraiment, j'ai beau chercher
j'vois pas comment il m'a mis en défaut.
=> http://www.noelshack.com/up/aaa/erreur_prologin_demi_2003_plages_du_pacifique-f4f1a63d97.JPG
Apparemment y'a plus de plages qu'il n'en faut. Mais j'arrive pas à savoir comment les terres en trop sont comptées.
L'idéal serait d'avoir la carte fournie par l'évaluateur pour que je puisse débugguer. >.>
Sinon bah v'là mon code (pas trop commenté excepté des détails sur une ligne un peu chelou), de toutes façons "il marche pas" : (au fait, j'ai vu quelque-part que les balises code déconnaient, l'aperçu me le confirme ... désolé pour l'indentation et pour vos yeux)
1 2 | #include #include |
void mapocean(int n, int m, int map[100][100], int posn, int posm) /* 0 : eau, 1 : terre, 2 : eau->ocean */
{
map[posn][posm] = 2;
/* H */
if(posn > 0 && !map[posn-1][posm])
mapocean(n, m, map, posn-1, posm);
/* B */
if(posn mapocean(n, m, map, posn+1, posm);
/* G */
if(posm > 0 && !map[posn][posm-1])
mapocean(n, m, map, posn, posm-1);
/* D */
if(posm mapocean(n, m, map, posn, posm+1);
/* HG */
if(posn > 0 && posm > 0 && !map[posn-1][posm-1])
mapocean(n, m, map, posn-1, posm-1);
/* BD */
if(posn mapocean(n, m, map, posn+1, posm+1);
/* HD */
if(posn > 0 && posm mapocean(n, m, map, posn-1, posm+1);
/* BG */
if(posn 0 && !map[posn+1][posm-1])
mapocean(n, m, map, posn+1, posm-1);
}
int presocean(int N, int M, int map[100][100], int i, int j)
{
int plage = 0;
int n;
int m;
for(n = i-1; n {
for(m = j-1; m {
if(n >= 0 && n = 0 && m plage = 1;
/*
Explications sur la condition :
Les 4 premiers éléments de l'expression booléenne vérifient si on ne se trouve pas hors de la carte.
Le 5ème élément vérifie si on n'est pas en diagonale (sisi).
Le 6ème élément vérifie si on a un bout d'océan.
*/
}
}
return plage;
}
int compteplages(int n, int m, int map[100][100])
{
int i;
int j;
int num = 0;
for(i = 0; i {
for(j = 0; j {
if(map[i][j] == 1 && presocean(n, m, map, i, j))
{
num++;
map[i][j] = 3; /* pour débogage */
}
}
}
return num;
}
void affichemap(int n, int m, int map[100][100])
{
int i;
int j;
for(i = 0; i {
for(j = 0; j {
printf("%d", map[j][i]);
}
printf("\n");
}
}
int main(void)
{
int i;
int j;
int n;
int m;
int map[100][100];
char c;
int numplages;
scanf("%d %d\n", &n, &m);
for (i = 0; i for (j = 0; j {
do
{
scanf("%c", &c);
}while ((c == '\n') || (c == '\r'));
map[j][i] = c - '0';
}
mapocean(n, m, map, 0, 0);
numplages = compteplages(n, m, map);
printf("%d\n", numplages);
/*affichemap(n, m, map);*/ /* pour le débogage */
return 0;
}
Merci. =)
Et aussi dernière question tant qu'à faire : sur les épreuves de 2002 je crois (j'peux même pas vérifier maintenant à cause du blocage dont j'ai parlé tout en haut), il y a 4 exercices (liés au QCM si je me souviens bien), je les ai fait avec succès et dans le classement, certaines personnes ont 500 points, d'où sortent les 100 points supplémentaires ? Apparemment je ne suis pas le seul dans le classement qui plafonne à 400 ...
edit : nan c'est le QCM 2003, j'ai pu vérifier en entrant directement l'url.