<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=0150_-_Shift_1</id>
	<title>0150 - Shift 1 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=0150_-_Shift_1"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0150_-_Shift_1&amp;action=history"/>
	<updated>2026-05-02T21:58:03Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0150_-_Shift_1&amp;diff=9292&amp;oldid=prev</id>
		<title>Oros Ioana Diana: Pagină nouă: Bulbuka este foarte pasionată de gătit deserturi. Ea a decis să facă (n+2)*(n+2) brioşe pe care le-a numerotat (cu ciocolată, bineinţeles) în modul următor: primele n*n brioşe au fost numerotate de la 1 la n*n, iar restul până la (n+2)*(n+2) au primit valoarea 0. De asemenea, după ce au fost gata, Bulbuka nu a putut rezista tentaţiei de a ordona brioşele într-un pătrat cu latura (n+2) după cum urmează: cele cu 0 pe conturul exterior iar cele numerotate de l...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0150_-_Shift_1&amp;diff=9292&amp;oldid=prev"/>
		<updated>2024-01-08T23:52:14Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: Bulbuka este foarte pasionată de gătit deserturi. Ea a decis să facă (n+2)*(n+2) brioşe pe care le-a numerotat (cu ciocolată, bineinţeles) în modul următor: primele n*n brioşe au fost numerotate de la 1 la n*n, iar restul până la (n+2)*(n+2) au primit valoarea 0. De asemenea, după ce au fost gata, Bulbuka nu a putut rezista tentaţiei de a ordona brioşele într-un pătrat cu latura (n+2) după cum urmează: cele cu 0 pe conturul exterior iar cele numerotate de l...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Bulbuka este foarte pasionată de gătit deserturi. Ea a decis să facă (n+2)*(n+2) brioşe pe care le-a numerotat (cu ciocolată, bineinţeles) în modul următor: primele n*n brioşe au fost numerotate de la 1 la n*n, iar restul până la (n+2)*(n+2) au primit valoarea 0. De asemenea, după ce au fost gata, Bulbuka nu a putut rezista tentaţiei de a ordona brioşele într-un pătrat cu latura (n+2) după cum urmează: cele cu 0 pe conturul exterior iar cele numerotate de la 1 la n*n, în interior, în ordine crescătoare, pe linii, de sus in jos, ca în figura alăturată. Bulbuka a numit această aranjare configuraţia ordonată a brioşelor.&lt;br /&gt;
&lt;br /&gt;
Acest aranjament frumos a durat foarte puţin deoarece, pe când Bulbuka stătea cu spatele, Randomel a amestecat brioşele între ele, într-o ordine aleatoare. Când s-a întors şi a văzut fapta, ea s-a supărat foarte tare şi l-a pedepsit pe Randomel punându-l să le aranjeze la loc cum erau (ca în imagine) folosind doar un set limitat de operaţii: shiftări circulare pe linii şi pe coloane. O shiftare presupune deplasarea circulară la dreapta, pe linie sau în jos, pe coloană, cu cel puţin una şi cel mult n+1 poziţii.&lt;br /&gt;
== Cerința ==&lt;br /&gt;
Randomel vă roagă să scrieţi un program care, pentru o aranjare aleatorie a brioşelor, să afişeze shiftările circulare posibile care transformă configuraţia dată într-o configuraţie ordonată.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Pe prima linie a fişierului de intrare shift1in.txt se află numărul natural n. Pe următoarele n+2 linii se află câte n+2 numere naturale reprezentând elementele configuraţiei date.&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Fişierul de ieşire shift1out.txt va conţine pe prima linie k, numărul de shiftări necesare. Pe următoarele k linii se vor scrie shiftările făcute, câte o operaţie pe o linie. O shiftare este descrisă astfel: litera L (linie) sau C (coloana) pe care s-a efectuat operaţia, indicele liniei/coloanei şi numărul de brioşe deplasate, separate prin câte un spaţiu&lt;br /&gt;
== Restricții și precizări ==&lt;br /&gt;
*1 ≤ N ≤ 500&lt;br /&gt;
*Se vor accepta numai soluţii în care numărul de mutări este mai mic decât 1234567&lt;br /&gt;
*Numerotarea liniilor/coloanelor începe de la 0&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; shift1in.txt&lt;br /&gt;
: 3&lt;br /&gt;
: 0 0 0 4 0&lt;br /&gt;
: 0 0 2 9 0&lt;br /&gt;
: 0 1 5 6 0&lt;br /&gt;
: 0 0 8 0 0&lt;br /&gt;
: 0 7 0 3 0&lt;br /&gt;
; shift1out.txt&lt;br /&gt;
: 4&lt;br /&gt;
: C 1 4&lt;br /&gt;
: L 2 2&lt;br /&gt;
: C 3 2&lt;br /&gt;
: L 2 3&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; shift1in.txt&lt;br /&gt;
: 4&lt;br /&gt;
: 0 0 0 0 0&lt;br /&gt;
: 0 0 0 0 0&lt;br /&gt;
: 0 1 3 4 0&lt;br /&gt;
: 0 0 0 0 0&lt;br /&gt;
: 0 7 0 8 0&lt;br /&gt;
; shift1out.txt&lt;br /&gt;
: 2&lt;br /&gt;
: L 2 2&lt;br /&gt;
: C 4 1&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
#0150 - Shift 1&lt;br /&gt;
def find_shifts(n, config):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 500):&lt;br /&gt;
        print(&amp;quot;Fals&amp;quot;)&lt;br /&gt;
        return []&lt;br /&gt;
&lt;br /&gt;
    shifts = []&lt;br /&gt;
&lt;br /&gt;
    # Identificăm poziția 0-urilor pe marginea exterioară&lt;br /&gt;
    zero_positions = []&lt;br /&gt;
    for i in range(n + 2):&lt;br /&gt;
        for j in range(n + 2):&lt;br /&gt;
            if config[i][j] == 0:&lt;br /&gt;
                zero_positions.append((i, j))&lt;br /&gt;
&lt;br /&gt;
    # Shiftăm 0-urile pe marginea superioară&lt;br /&gt;
    for j in range(n + 2):&lt;br /&gt;
        target_row = 0&lt;br /&gt;
        while zero_positions[j][0] != target_row:&lt;br /&gt;
            shifts.append((&amp;#039;L&amp;#039;, zero_positions[j][0], 1))&lt;br /&gt;
            target_row += 1&lt;br /&gt;
&lt;br /&gt;
    # Shiftăm 0-urile pe marginea dreaptă&lt;br /&gt;
    for i in range(1, n + 2):&lt;br /&gt;
        target_col = n + 1&lt;br /&gt;
        while zero_positions[i][1] != target_col:&lt;br /&gt;
            shifts.append((&amp;#039;C&amp;#039;, zero_positions[i][1], 1))&lt;br /&gt;
            target_col -= 1&lt;br /&gt;
&lt;br /&gt;
    return shifts&lt;br /&gt;
&lt;br /&gt;
# Citirea datelor de intrare&lt;br /&gt;
with open(&amp;quot;shift1in.txt&amp;quot;, &amp;quot;r&amp;quot;) as infile:&lt;br /&gt;
    n = int(infile.readline())&lt;br /&gt;
    config = [list(map(int, line.split())) for line in infile]&lt;br /&gt;
&lt;br /&gt;
# Verificarea restricțiilor și calculul rezultatului&lt;br /&gt;
shifts = find_shifts(n, config)&lt;br /&gt;
&lt;br /&gt;
# Scrierea rezultatului în fișierul de ieșire&lt;br /&gt;
if shifts:&lt;br /&gt;
    with open(&amp;quot;shift1out.txt&amp;quot;, &amp;quot;w&amp;quot;) as outfile:&lt;br /&gt;
        outfile.write(str(len(shifts)) + &amp;#039;\n&amp;#039;)&lt;br /&gt;
        for shift in shifts:&lt;br /&gt;
            outfile.write(&amp;#039; &amp;#039;.join(map(str, shift)) + &amp;#039;\n&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicatie ==&lt;br /&gt;
Coloana cu indicele 1 se va shifta circular în jos cu 4 poziţii, apoi linia 2 se shiftează circular la dreapta cu 2 poziţii etc.&lt;/div&gt;</summary>
		<author><name>Oros Ioana Diana</name></author>
	</entry>
</feed>