1291 - CifreGen4
De la Universitas MediaWiki
Cerința
Se dau două numere n m. Să se genereze toate numerele cu exact n cifre mai mici decât m cu proprietatea că diferența în valoare absolută dintre oricare două cifre consecutive este cel puțin 2.
Date de intrare
Programul citește de la tastatură numerele n m.
Date de ieșire
Programul va afișa pe ecran numerele generate, câte unul pe linie, în ordine crescătoare.
Restricții și precizări
- 1 ≤ n ≤ 7
- 0 < m < 6
Exemplu 1
- Intrare
3 4
- Iesire
130
131
202
203
302
303
313
Rezolvare
def read_input():
n, m = map(int, input().strip().split())
return n, m
def write_output(numbers):
for number in numbers:
print(number)
def is_valid(number, n, m):
# Verifică dacă numărul are exact n cifre și fiecare cifră este mai mică decât m
if len(number) != n:
return False
for digit in number:
if int(digit) >= m:
return False
# Verifică dacă diferența dintre orice două cifre consecutive este cel puțin 2
for i in range(1, len(number)):
if abs(int(number[i]) - int(number[i - 1])) < 2:
return False
return True
def generate_numbers(n, m, current_number, numbers):
if len(current_number) == n:
if is_valid(current_number, n, m):
numbers.append(current_number)
return
for digit in range(0, m):
if len(current_number) == 0 and digit == 0:
continue
if len(current_number) == 0 or abs(int(current_number[-1]) - digit) >= 2:
generate_numbers(n, m, current_number + str(digit), numbers)
def main():
n, m = read_input()
# Validări
if not (1 <= n <= 7):
raise ValueError("n trebuie să fie între 1 și 7")
if not (0 < m < 6):
raise ValueError("m trebuie să fie între 1 și 5")
numbers = []
generate_numbers(n, m, "", numbers)
numbers.sort()
write_output(numbers)
if __name__ == '__main__':
main()