1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
| public class Exercice {
private static final int[][] CARTE1 = {
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0},
{0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,0,0},
{0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,0,0},
{0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,0},
{0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,0,0,0,0},
{0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0},
{0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0},
{0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0},
{0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0},
{0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0},
{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0},
{0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
};
private static final int[][] CARTE2 = {
{0,1,1,0},
{0,1,1,0}
};
private static final int[][] CARTE3 = {
{0,1,1,1,1,1,0},
{0,1,1,1,1,1,0},
{0,1,1,1,1,1,0}
};
private static final int[][] CARTE4 = {
{0,1,1,1,1,1,0},
{0,1,0,0,0,1,0},
{0,1,1,1,1,1,0}
};
private static final int[][] CARTE5 = {
{0,1,1,1,1,1,0},
{0,0,1,0,1,0,0},
{0,1,1,1,1,1,0}
};
public static void main(String[] args) {
int[][] carte = CARTE1; // remplacer CARTE1, par CARTE2, CARTE3... pour tester sur différents cas.
System.out.println("Carte :");
for(int[] ligne : carte) {
for(int item : ligne) {
System.out.print(item);
}
System.out.println();
}
// on "efface" les étangs
for(int[] ligne : carte) {
int premierUnAGauche = -1;
for(int index=0; premierUnAGauche==-1 && index<ligne.length; index++) {
if ( ligne[index]==1 ) {
premierUnAGauche=index;
}
}
if ( premierUnAGauche>=0 ) { // inutile de chercher le dernier un à droite, il n'y en a pas dans la ligne
int dernierUnADroite = -1;
for(int index=ligne.length-1; dernierUnADroite==-1 && index>=0; index--) {
if ( ligne[index]==1 ) {
dernierUnADroite=index;
}
}
if ( premierUnAGauche<dernierUnADroite ) { // s'ils sont égaux, on a qu'un seul un dans la ligne : rien à remplir donc
for(int index=premierUnAGauche; index<dernierUnADroite; index++) {
if ( ligne[index]==0 ) { // on n'est pas obligé de faire ce test : si on le fait pas, on remplace des 1 par 1
ligne[index]=1;
}
}
}
}
}
System.out.println("Carte avec les étangs \"effacés\"");
for(int[] ligne : carte) {
for(int item : ligne) {
System.out.print(item);
}
System.out.println();
}
// on compte les faces exposées
int nbFaces = 0;
for(int i=0; i<carte.length; i++) {
for(int j=0; j<carte[i].length; j++) {
if ( carte[i][j]==1 ) {
// on compte les 0 en dessous, au dessus, à droite et à gauche
// au dessus [i-1][j], (correspond à (-1,0) dans la notation ci-après)
// en dessous [i+1][j] (correspond à (1,0))
// à gauche [i][j-1] (correspond à (0,-1)
// à droite [i][j+1] (correspond à (0,1)
// si on boucle de -1 à +1 selon les deux axes,
// il suffit d'éliminer le centre (0,0) et les coins (-1,-1), (-1,1), (1,-1), (1,1)
// on remarque que les éléments à éliminer sont ceux tels que les deux sont égaux, ou égaux au signe près
for(int di=-1; di<=1; di++) {
for(int dj=-1; dj<=1; dj++) {
if ( !( (di==dj) || (di==-dj) ) ) {
int y=i+di;
int x=j+dj;
if ( x<0 || x>=carte[i].length || y<0 || y>=carte.length ) {
// on est en dehors de la carte
// ça compte pour une case vide (donc une face exposée)
nbFaces++;
}
else if ( carte[y][x]==0 ) {
nbFaces++;
}
}
}
}
}
}
}
System.out.printf("La longueur de clôture nécessaire est : %.2f mètres%n", nbFaces * 2.5 );
}
} |