[HackerRank] Queen's Attack II
출처 : https://www.hackerrank.com/challenges/queens-attack-2/problem?h_r=internal-search
#include <bits/stdc++.h>
using namespace std;
vector<string> split_string(string);
int queensAttack(int n, int k, int r_q, int c_q, vector<vector<int>> obstacles) {
int ans = 0;
bool check[8] = {0,0,0,0,0,0,0,0};
int ck[8] = { 0,0,0,0,0,0,0,0 };
for (int i = 0; i < k; i++) {
int xr = obstacles[i][0]; int xc = obstacles[i][1];
if (xr == r_q && xc != c_q) {
if (xc > c_q) {
if (check[2]) ck[2] = min(ck[2], (xc - c_q - 1));
else { check[2] = true; ck[2] = (xc - c_q - 1); }
}
else {
if (check[6]) ck[6] = min(ck[6], (c_q - xc - 1));
else { check[6] = true; ck[6] = (c_q - xc - 1);}
}
}
else if (xc == c_q && xr != r_q) {
if (xr > r_q) {
if (check[0]) ck[0] = min(ck[0], (xr - r_q - 1));
else { check[0] = true; ck[0] = (xr - r_q - 1); }
}
else {
if (check[4]) ck[4] = min(ck[4], (r_q - xr - 1));
else { check[4] = true; ck[4] = (r_q - xr - 1); }
}
}
else if (abs(xr - r_q) == abs(xc - c_q)) {
if (xr > r_q) {
if (xc > c_q) {
if (check[1]) ck[1] = min(ck[1], (abs(xr - r_q) - 1));
else { check[1] = true; ck[1] = (abs(xr - r_q) - 1); }
}
else {
if (check[7]) ck[7] = min(ck[7], (abs(xr - r_q) - 1));
else { check[7] = true; ck[7] = (abs(xr - r_q) - 1); }
}
}
else {
if (xc > c_q) {
if (check[3]) ck[3] = min(ck[3], (abs(xr - r_q) - 1));
else { check[3] = true; ck[3] = (abs(xr - r_q) - 1); }
}
else {
if (check[5]) ck[5] = min(ck[5], (abs(xr - r_q) - 1));
else { check[5] = true; ck[5] = (abs(xr - r_q) - 1); }
}
}
}
}
for (int i = 0; i < 8; i++) if (ck[i]) ans += ck[i];
for (int d = 0; d < 8; d++) {
if (!check[d]) {
if (d == 0) ans += (n - r_q);
else if (d == 4 ) ans += (r_q - 1);
else if (d == 2 ) ans += (n - c_q);
else if (d == 6 ) ans += (c_q - 1);
else if (d == 1 ) ans += (min((n-c_q),(n-r_q)));
else if (d == 3 ) ans += (min((n - c_q), (r_q-1)));
else if (d == 5 ) ans += (min((c_q-1), (r_q-1)));
else if (d == 7 ) ans += (min((c_q-1), (n - r_q)));
}
}
return ans;
}
int main()
{
ofstream fout(getenv("OUTPUT_PATH"));
string nk_temp;
getline(cin, nk_temp);
vector<string> nk = split_string(nk_temp);
int n = stoi(nk[0]);
int k = stoi(nk[1]);
string r_qC_q_temp;
getline(cin, r_qC_q_temp);
vector<string> r_qC_q = split_string(r_qC_q_temp);
int r_q = stoi(r_qC_q[0]);
int c_q = stoi(r_qC_q[1]);
vector<vector<int>> obstacles(k);
for (int i = 0; i < k; i++) {
obstacles[i].resize(2);
for (int j = 0; j < 2; j++) {
cin >> obstacles[i][j];
}
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
int result = queensAttack(n, k, r_q, c_q, obstacles);
fout << result << "\n";
fout.close();
return 0;
}
vector<string> split_string(string input_string) {
string::iterator new_end = unique(input_string.begin(), input_string.end(), [](const char &x, const char &y) {
return x == y and x == ' ';
});
input_string.erase(new_end, input_string.end());
while (input_string[input_string.length() - 1] == ' ') {
input_string.pop_back();
}
vector<string> splits;
char delimiter = ' ';
size_t i = 0;
size_t pos = input_string.find(delimiter);
while (pos != string::npos) {
splits.push_back(input_string.substr(i, pos - i));
i = pos + 1;
pos = input_string.find(delimiter, i);
}
splits.push_back(input_string.substr(i, min(pos, input_string.length()) - i + 1));
return splits;
}