# PBinfo #3943 – Cerc5 – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: Darius

## Enunț

Cerinţa
Se dă numărul natural n. Determinati o modalitate de așezare a numerelor din mulțimea \({1,2,…,n}\) pe un cerc astfel încât suma a oricare două nume învecinate să fie pătrat perfect.

Date de intrare
Programul citește de la tastatură numărul n.

Date de ieșire
Programul va afișa pe ecran cele n numere cerute, separate prin câte un spațiu.

Restricții și precizări

1 ≤ n ≤ 35
dacă există mai multe modalități de aranjare a numerelor astfel încât să fie îndeplinită condiția, se poate afișa oricare;
dacă nu există nicio modalitate de aranjare se va afișa mesajul nu exista

Exemplu:
Intrare

32
Ieșire

29 7 18 31 5 11 25 24 12 13 3 6 30 19 17 32 4 21 28 8 1 15 10 26 23 2 14 22 27 9 16 20
Explicație

## Cod sursă C++

```cpp
#include <iostream>
#include <cmath>
using namespace std;
int n , x[35 + 1] , uz[35 + 1], gata;
void Afisare()
{
	gata = true;
	for(int i = 1 ; i <= n ; i ++)
		cout << x[i] << " ";
	cout << "\n";
}
bool OK(int k)
{
	if(k == 1)
		return true;
	if(sqrt(x[k] + x[k-1]) != (int)sqrt(x[k] + x[k-1]))
		return false;
	if(k == n)
		if(sqrt(x[k] + x[1]) != (int)sqrt(x[k] + x[1]))
			return false;
	return true;
}
void Back(int k)
{
	for(int i = 1 ; i <= n && ! gata; i ++)
		if(uz[i] == 0)
		{
			uz[i] = 1;
			x[k] = i;
			if(OK(k))
			{
				if(k == n)
					Afisare();
				else
					Back(k +1);
			}
			uz[i] = 0;
		}
}
int main()
{
	cin >> n;
	x[1] = 1, uz[1] = 1;
	Back(2);
	if(! gata)
		cout << "nu exista";
	return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/3943)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/3943/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-3943/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
