https://www.hackerrank.com/challenges/magic-square-forming/problem
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
// Driven Program
int find_magic_square(vector<int> vTemp)
{
int arrTemp[3][3];
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
arrTemp[i][j] = vTemp[3 * i + j];
}
}
int iCom(0);
for (int i = 0; i < 3; i++)
{
iCom += arrTemp[0][i];
}
for (int i = 1; i < 3; i++)//Row
{
int iTemp(0);
for (int j = 0; j < 3; j++)
{
iTemp += arrTemp[i][j];
}
if (iCom != iTemp) return 0;
}
for (int i = 0; i < 3; i++)//Col
{
int iTemp(0);
for (int j = 0; j < 3; j++)
{
iTemp += arrTemp[j][i];
}
if (iCom != iTemp) return 0;
}
int iTemp(0);
for (int i = 0; i < 3; i++)
{
iTemp += arrTemp[i][i];//
}
if (iCom != iTemp) return 0;
int iTemp1(0);
for (int i = 0; i < 3; i++)//
{
iTemp1 += arrTemp[2 - i][i];
}
if (iCom != iTemp1) return 0;
return 1;
}
int cal_min(vector<int> vinput,vector<int> vcompare)//
{
int iTemp(0);
for (int i = 0; i < vcompare.size();i++)
{
iTemp += abs(vinput[i] - vcompare[i]);
}
return iTemp;
}
int main()
{
vector<int> vinput;
for(int i=0; i<3; i++)
{
for(int j=0; j<3; j++)
{
int iTemp; cin>>iTemp; vinput.push_back(iTemp);
}
}
vector<int> vTemp;
for (int i = 1; i <= 9; i++)
{
vTemp.push_back(i);
}
vector<vector<int>> vvTemp;
do
{
if (1 == find_magic_square(vTemp))
{
vvTemp.push_back(vTemp);
}
} while (next_permutation(vTemp.begin(), vTemp.end()));
int Answer(999999999);
for (int i = 0; i < vvTemp.size(); i ++)
{
Answer = min(Answer, cal_min(vinput, vvTemp[i]));
}
cout << Answer << endl;
return 0;
}
해커랭크 미디엄 처음 풀어봄.
이 문제 풀 때 한글 주석 달면 넌아스키코드라고 계속 알람나옴. 한글달면안됨.
[연습코드]
using namespace std;
#include <vector>
#include <algorithm>
#include <iostream>
// Driven Program
int find_magic_square(vector<int> vTemp)
{
int arrTemp[3][3];
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
arrTemp[i][j] = vTemp[3 * i + j];
}
}
int iCom(0);
for (int i = 0; i < 3; i++)
{
iCom += arrTemp[0][i];
}
for (int i = 1; i < 3; i++)//Row
{
int iTemp(0);
for (int j = 0; j < 3; j++)
{
iTemp += arrTemp[i][j];
}
if (iCom != iTemp) return 0;
}
for (int i = 0; i < 3; i++)//Col
{
int iTemp(0);
for (int j = 0; j < 3; j++)
{
iTemp += arrTemp[j][i];
}
if (iCom != iTemp) return 0;
}
int iTemp(0);
for (int i = 0; i < 3; i++)
{
iTemp += arrTemp[i][i];//대각형태 1;
}
if (iCom != iTemp) return 0;
int iTemp1(0);
for (int i = 0; i < 3; i++)//대각형태 2
{
iTemp1 += arrTemp[2 - i][i];
}
if (iCom != iTemp1) return 0;
return 1;
}
int cal_min(vector<int> vinput,vector<int> vcompare)//2차원 벡터 두개 비교하는 함수입니다.
{
int iTemp(0);
for (int i = 0; i < vcompare.size();i++)
{
iTemp += abs(vinput[i] - vcompare[i]);
}
return iTemp;
}
int main()
{
// Taking matrix in vector in rowise to make
// calculation easy
vector<int> vinput = { 5,3,4,1,5,8,6,4,2 };
vector<vector<int>> vvTemp;
//vector<vector<int>> vvTemp2;
//for (int i = 0; i < 3; i++)
//{
// vector<int> vinput;
// for (int j = (3*i); j < (3*i)+3; j++)
// {
// vinput.push_back(j);
// }
// vvTemp1.push_back(vinput);
//}
vector<int> vTemp;
for (int i = 1; i <= 9; i++)
{
vTemp.push_back(i);
}
do
{
if (1 == find_magic_square(vTemp))
{
vvTemp.push_back(vTemp);
}
} while (next_permutation(vTemp.begin(), vTemp.end()));
int Answer(999999999);
for (int i = 0; i < vvTemp.size(); i ++)
{
Answer = min(Answer, cal_min(vinput, vvTemp[i]));
}
cout << Answer << endl;
return 0;
}
[이문제 통해서]
1.
do
{
}while(next_permutation(vTemp.begin(),vTemp.end()));
순열조합 처리하기 까먹지말기