• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

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

  • Автор темы Nigrum-papilio
  • Дата начала
N

Nigrum-papilio

Магический квадрат 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

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!