Магический Квадрат 3*3

08.02.2014
1
0
#1
Магический квадрат 3*3 заполненый цифрами от 1 до 9, где сума в каждой строчке, столбце и 2-х диагоналях равна 15
Написать не составило труда, но возникла проблемка с оптимизацией, он его заполняет вечность.
Если убрать заполнение квадрата уникальными числами 1-9 то быстро все заполняет но некоторые цифры повторяются что не правильно для магического квадрата.
Если не очень сложно помогите оптимизировать.
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"Код"</div></div><div class="sp-body"><div class="sp-content">#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;

int main(){
srand(time(0));
const int S=3;
int mas={0};
bool unik;
int x;
while(mas[0][0]+mas[0][1]+mas[0][2]!=15||
mas[1][0]+mas[1][1]+mas[1][2]!=15||
mas[2][0]+mas[2][1]+mas[2][2]!=15||
mas[0][0]+mas[1][0]+mas[2][0]!=15||
mas[0][1]+mas[1][1]+mas[2][2]!=15||
mas[0][2]+mas[1][2]+mas[2][2]!=15||
mas[0][0]+mas[1][1]+mas[2][2]!=15||
mas[2][0]+mas[1][1]+mas[0][2]!=15){
for(int i=0;i<S;i++){
for(int j=0; j<S; j++){
mas[j]=rand()%9+1;
}
}

for(int k = 0; k < 9; k++){
do{
unik = true;
x = rand()%9+1;
for(int i = 0; i <S; i++ ){
for(int j = 0; j < S; j++){
if(mas[j] == x)
{
unik = false; break;
}
}
}
}while(!unik);

mas[k/3][k%3] = x;
}

for(int i=0;i<S;i++){
for(int j=0; j<S; j++){
cout<<mas[j]<<" ";
}
cout<<endl;
}
}
 
W

Whatka

#2
У тебя всего 10 неповторяющихся комбинаций из 3 чисел от 1 до 9 с суммой 15
Т.е. ты можешь получить все такие магические квадараты используя различные расположения этих троек в квадрате