Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Main page
Recent changes
Random page
Help about MediaWiki
Bitnami MediaWiki
Search
Search
Create account
Log in
Personal tools
Create account
Log in
Pages for logged out editors
learn more
Contributions
Talk
Editing
0864 - Roboti
Page
Discussion
English
Read
Edit
Edit source
View history
Tools
Tools
move to sidebar
hide
Actions
Read
Edit
Edit source
View history
General
What links here
Related changes
Special pages
Page information
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
==Cerința== Se dă o matrice cu '''n''' linii și '''m''' coloane și elemente '''0''' sau '''1''', reprezentând planul unui teren în care '''0''' reprezintă o zonă accesibilă, iar '''1''' reprezintă o zonă inaccesibilă. O zonă a terenului are ca și coordonate linia și coloana corespunzătoare din matrice. Într-o zonă cunoscută a matricei se află un robot, iar în altă zonă, de asemenea cunoscută, se află o roboțică. Determinați numărul minim de pași prin care robotul va ajunge la roboțică. Dacă nu este posibil ca robotul să ajungă la roboțică, rezultatul va fi '''-1'''. ==Date de intrare== Fișierul de intrare '''robotiin.txt''' conține pe prima linie numerele '''n m'''. Următoarele '''n''' linii conțin câte '''m''' valori, '''0''' sau '''1'''. Următoarele două linii conțin câte două valori, reprezentând coordonatele robotului, respectiv ale roboțicii. ==Date de ieșire== Fișierul de ieșire '''robotiout.txt''' va conține pe prima linie valoarea cerută. ==Restricții și precizări== *'''1 ≤ n , m ≤ 1000 *zonele pe care se află inițial cei doi roboți sunt libere și sunt diferite *un pas reprezintă trecerea robotului din zona curentă într-o zonă vecină cu aceasta pe linie sau pe coloană, fără a părăsi matricea. ==Exemplul 1:== ;robotiin.txt 4 5 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 1 1 0 0 1 1 2 2 5 ;robotiout.txt Datele de intrare corespund restrictiilor impuse 4 ==Exemplul 2:== ;robotiin.txt robot ;robotiout.txt Datele de intrare nu corespund restrictiilor impuse ==Explicație== Un traseu al robotului format din '''4''' pași este evidențiat mai jos. 1 '''0 0 0''' 1 0 0 1 '''0 0''' 0 0 0 0 1 1 1 0 0 1 Există și alte trasee posibile, dar lungimea lor este mai mare. ==Rezolvare== <syntaxhighlight lang="python" line="1" start="1"> from collections import deque def validare(nr_n, nr_m, matrix, x_inceput, y_inceput, x_sfarsit, y_sfarsit, fisier_out): if not (1 <= nr_n <= 1000 and 1 <= nr_m <= 1000): raise ValueError for linie in matrix: for elem in linie: if not isinstance(elem, int): raise ValueError if not (0 <= x_inceput < nr_n and 0 <= y_inceput < nr_m and 0 <= x_sfarsit < nr_n and 0 <= y_sfarsit < nr_m): raise ValueError if matrix[x_inceput][y_inceput] != 0 or matrix[x_sfarsit][y_sfarsit] != 0 or (x_inceput == x_sfarsit and y_inceput == y_sfarsit): raise ValueError fisier_out.write("Datele de intrare corespund restrictiilor impuse\n") def bfs(nr_n, nr_m, matrix, x_inceput, y_inceput, x_sfarsit, y_sfarsit): dx = [-1, 0, 1, 0] dy = [0, 1, 0, -1] distanta = [[-1 for _ in range(nr_m)] for _ in range(nr_n)] coada = deque() coada.append((x_inceput, y_inceput)) distanta[x_inceput][y_inceput] = 0 while coada: x, y = coada.popleft() for directie in range(4): new_x, new_y = x + dx[directie], y + dy[directie] if 0 <= new_x < nr_n and 0 <= new_y < nr_m and matrix[new_x][new_y] == 0 and distanta[new_x][new_y] == -1: coada.append((new_x, new_y)) distanta[new_x][new_y] = distanta[x][y] + 1 return distanta[x_sfarsit][y_sfarsit] if __name__ == "__main__": file_in = open('robotiin.txt', 'r') file_out = open('robotiout.txt', 'w') try: n, m = map(int, file_in.readline().split()) matrice = [list(map(int, file_in.readline().split())) for _ in range(n)] x_start, y_start = map(int, file_in.readline().split()) x_end, y_end = map(int, file_in.readline().split()) validare(n, m, matrice, x_start-1, y_start-1, x_end-1, y_end-1, file_out) rezultat = bfs(n, m, matrice, x_start-1, y_start-1, x_end-1, y_end-1) file_out.write(str(rezultat)) except ValueError: file_out.write("Datele de intrare nu corespund restrictiilor impuse") except IndexError: file_out.write("Datele de intrare nu corespund restrictiilor impuse") </syntaxhighlight>
Summary:
Please note that all contributions to Bitnami MediaWiki may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
Bitnami MediaWiki:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Toggle limited content width