원래 규칙을 찾아서 구현하는 문제인데, 랜덤으로 숫자를 넣어 해결해 보기로 했다.
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <vector>
int main()
{
srand((unsigned int)time(NULL));
int mabangjin = 0;
std::cout << "마방진의 크기를 정해주세요" << std::endl;
std::cin >> mabangjin;
int side = mabangjin;
mabangjin = mabangjin * mabangjin;
// N * N의 숫자를 저장하는 array 1~N*N
int random = 0; // array 숫자 중 하나를 무작위
while (true) {
std::vector<std::vector<int>> matrix; //bingo판
std::vector<int> v; //빙고 한줄
std::vector<int>array;
int count = 0;
for (int i = 0; i < side; i++) {
matrix.push_back(v);
}
while (count < mabangjin)
{
bool is_exist = false; //array 안에 지금 뽑은 random 숫자가 있는지 판별하기 위한 bool
random = rand() % mabangjin + 1;
for (int i = 0; i < count; i++) {
if (array[i] == random) {
is_exist = true;
break;
}
}
if (is_exist == false) { //array 안에 없다면
array.push_back(random);
matrix[count / side].push_back(random);
// std::cout << "프로그레스 : " << matrix[count / side][count % side] << " ";
count++;
}
}
int diagonal1 = 0; //대각선1
int diagonal2 = 0; //대각선2
std::vector<int> answer_set; // 가로 세로 대각선 한 줄의 합이 들어있는 벡터
//int answer_set_size = 0;
for (int i = 0; i < side; i++) {
int row = 0; // 가로 한줄
int col = 0; // 세로 한줄
diagonal1 += matrix[i][i];
diagonal2 += matrix[i][side - i-1];
for (int j = 0; j < side; j++) {
col += matrix[i][j];
row += matrix[j][i];
}
answer_set.push_back(row);
answer_set.push_back(col);
//answer_set_size += 2;
}
answer_set.push_back(diagonal1);
answer_set.push_back(diagonal2);
//answer_set_size += 2;
std::cout << std::endl;
int answer = answer_set[0];
bool correct = true;
for (int i = 0; i < answer_set.size() ; i++) {
// std::cout << answer_set[i] << " ";
if (answer_set[i] != answer) {
correct = false;
break;
}
}
if (correct == true) {
for (int i = 0; i < side; i++) {
for (int j = 0; j < side; j++) {
std::cout << matrix[i][j] << " ";
}
std::cout << std::endl;
}
break;
}
//else {
//for (int i = 0; i < side; i++) {
//matrix[i].clear();
// }
/* matrix.clear();
array.clear();
answer_set.clear();
v.assign();*/
// }
}
}
등등....
3x3 마방진의 경우 정답을 맞출 확률이 9! 분의 1
5x5 마방진의 경우 25! 분의 1의 확률로 정답이 나온다.
이는 60억분의 1정도 되는 확률이다.
문제를 푸는 과정에서 while 문 안에 초기화조건을 넣어주어야 했는데 그걸 발견하지 못해서