Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- using namespace std;
- int** allocate(int l){
- int** a = new int*[l];
- for(int i = 0; i < l; i++)
- a[i] = new int[l];
- return a;
- }
- int sumX(int** a, int l, int x){
- int sum = 0;
- for(int y = 0; y < l; y++) sum += a[x][y];
- return sum;
- }
- int sumY(int** a, int l, int y){
- int sum = 0;
- for(int x = 0; x < l; x++) sum += a[x][y];
- return sum;
- }
- int sumDP(int** a, int l){
- int sum = 0;
- for(int i = 0; i < l; i++) sum += a[i][i];
- return sum;
- }
- int sumDS(int** a, int l){
- int sum = 0, n = l;
- for(int i = 0; i < l; i++) sum += a[i][--n];
- return sum;
- }
- bool verify(int** a, int l){
- bool b = true;
- int sum = sumX(a, l, 0), n = 1;
- while((n < l) && b){
- b = sumX(a, l, n) == sum;
- n++;
- }
- n = 0;
- while((n < l) && b){
- b = sumY(a, l, n) == sum;
- n++;
- }
- return b && (sumDP(a, l) == sum) && (sumDS(a, l));
- }
- void fill(int** a, int l, int n){
- for(int x = 0; x < l; x++)
- for(int y = 0; y < l; y++)
- a[x][y] = n;
- }
- void print(int** a, int l){
- for(int x = 0; x < l; x++) {
- for(int y = 0; y < l; y++)
- cout << a[x][y] << "\t";
- cout << endl;
- }
- }
- int nextD(int n, int l){
- if(--n < 0) n = l - 1;
- return n;
- }
- int nextI(int n, int l){
- if(++n >= l) n = 0;
- return n;
- }
- int main(){
- int l, i = 1, xNew, yNew, xOld, yOld = 0;
- do{
- cin >> l;
- }while((l % 2) == 0);
- int** a = allocate(l);
- fill(a, l, 0);
- xOld = l / 2;
- a[xOld][yOld] = 1;
- while(++i <= (l * l) ){
- xNew = nextD(xOld, l);
- yNew = nextD(yOld, l);
- if(a[xNew][yNew] == 0) {
- a[xNew][yNew] = i;
- xOld = xNew;
- yOld = yNew;
- } else {
- yOld = nextI(yOld, l);
- a[xOld][yOld] = i;
- }
- }
- print(a, l);
- if(verify(a, l)) cout << "True\n"; else cout << "False\n";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement