Sujet 6 (F)

On se donne un quadrillage dont les noeuds sont étiquettés par leurs coordonnées (entières) X,Y. Dans ce quadrillage, on insère des résistances - toutes de 1ohm - entre différents noeuds. Votre objectif est de trouver la résistance équivalente entre les noeuds du circuit de coordonnées (0,0) et (4,4).

Dans les cas de tests, on aura toujours la garantie de pouvoir trouver la résistance entre ces deux noeuds en n'utilisant que les deux règles simples suivantes : si deux tronçons de circuits de résistances équivalentes R1 et R2 sont en série, la résistance équivalente du tronçon global est R1+R2, et s'ils sont en parallèle, la résistance équivalente est (R1.R2)/(R1+R2).

En particulier, il n'y aura jamais de besoin d'utiliser de "transformation triangle-étoile". Les tronçons de circuits qui sont inutiles peuvent être ignorés.

Limites de temps et de mémoire (Python)

  • Temps : 1 s sur une machine à 1 GHz.
  • Mémoire : 8 000 ko.

Entrée

L'entrée du programme contient d'abord un entier n correspondant au nombre de résistances dans le circuit. Ensuite, elle contient une liste de n lignes de la forme :

xa ya xb yb

où (xa,ya) sont les coordonnées du premier noeud connecté à cette résistance et (xb,yb) sont les coordonnées du second noeud. Ces coordonnées seront toujours comprises entre 0 et 4. Le tout est suivi d'un retour à la ligne.

Sortie

La sortie de votre programme devra contenir la valeur, arrondie à 10−3 près, de la résistance équivalente demandée, cette résistance ne sera jamais infinie. La fonction "affiche_solution" des squelettes effectue elle-même l'arrondi quand elle est appelée, et vous n'avez donc normalement pas à vous en soucier si vous utilisez les squelettes. La réponse sera suivie d'un retour à la ligne.

Exemples

Exemple 1

entrée :

2
0 0 1 0
1 0 4 4

sortie :

2.000

Exemple 2

entrée :

2
0 0 4 4
0 0 4 4

sortie :

0.500

Exemple 3

entrée :

7
0 0 0 1
0 0 1 0
0 1 4 4
0 1 4 4
1 0 4 4
1 0 4 4
0 0 3 3

sortie :

0.750

Commentaires

Squelettes de codes :

(* Ce fichier contient tout ce qu'il faut pour lire les donnees en entree, les 
mettre dans des variables, et afficher votre resultat final en sortie. *)

(* fonction pour separer les elements en entree 
Il n'est pas necessaire de comprendre cette fonction pour utiliser le programme !*)
    let split_spaces chaine =
      let res = ref [] in
      let temp = ref "" in
  for i = 0 to String.length chaine - 1 do
    if chaine.[i]=' '
    then 
      begin
        res := !res @ [!temp];
        temp := "";
      end
    else
      temp := !temp ^ (String.sub chaine i 1);
  done;
  res := !res @ [!temp];
  !res;;
  
let n = int_of_string (input_line stdin);;

(* recuperation du tableau des resistances resistances.(i) contient la i+1eme resistance sous la forme [|xa;ya;xb;yb|] *)
let resistances =
  let resultat = Array.make n [||] in
  for i = 0 to n-1 do
    resultat.(i) <- Array.of_list (List.map int_of_string (split_spaces (input_line stdin)));
  done;
  resultat;;

(* fonction pour afficher votre solution *)
let affiche_solution i =
  Printf.printf "%.3f" i;
  print_newline();;

(* Mettez apres ceci le corps de votre programme *)
(* N'oubliez pas de terminer par un appel a affiche_solution !*)

(* Debut de votre programme *)


(* Fin de votre programme *)


Source : https://www.france-ioi.org/