Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2639 주차장 spj #52

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
145 changes: 145 additions & 0 deletions 2639.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
#include<bits/stdc++.h>

/*
원래 이 문제는 유저가 제출한 K 값이 정답과 가까울 수록 높은 점수를 받는 부분점수 문제입니다.
따라서 spj에서 이걸 확인하지 않도록 했습니다. (아래쪽 주석 참고)
그리고 원래 시간 제한이 20초인데(...) BOJ에 적용할 때에는 언어별 추가 시간을 없애고
5초나 10초 정도로 시간 제한을 줄이는 게 좋아 보입니다.
*/


using namespace std;

int n;
int parking_lot[15][15];
bool checked[15][15];
bool car1exit;

struct Car {
int num, row, col, len;
bool is_vert;
Car() {}
Car(int n, int r, int c, int l, bool v) : num(n), row(r), col(c), len(l), is_vert(v) {}
};
Car cars[113];

int k, x, d;


void read_int(ifstream &ifs, int &res) {
string tmp;
size_t sz;
assert(ifs >> tmp);
res = stoi(tmp, &sz);
assert(tmp.size() == sz);
}


bool move_car(Car &car, int dist) {
cout << "move car #" << car.num << " by " << dist << endl;
if (car.is_vert) {
int new_row = car.row - dist;
if ((car.num != 1 && new_row < 0) || new_row >= n)
return false;
for (int i = car.row + (dist > 0? -1 : car.len); (dist > 0? i >= 0 && i >= new_row : i < new_row + car.len); (dist > 0? i-- : i++))
if (parking_lot[i][car.col] != 0)
return false;
for (int i = car.row; i < car.row + car.len; i++)
parking_lot[i][car.col] = 0;
if (car.num == 1 && new_row <= -car.len) {
car1exit = true;
return true;
}
if (car.num == 1 && new_row < 0)
return false;
for (int i = new_row; i < new_row + car.len; i++)
parking_lot[i][car.col] = car.num;
car.row = new_row;
return true;
}
int new_col = car.col + dist;
if ((car.num != 1 && new_col >= n) || new_col < 0)
return false;
for (int j = car.col + (dist > 0? 1 : -car.len); (dist > 0? j < n && j <= new_col : j > new_col - car.len); (dist > 0? j++ : j--))
if (parking_lot[car.row][j] != 0)
return false;
for (int j = car.col; j > car.col - car.len; j--)
parking_lot[car.row][j] = 0;
if (car.num == 1 && new_col >= n-1+car.len) {
car1exit = true;
return true;
}
if (car.num == 1 && new_col >= n)
return false;
for (int j = new_col; j > new_col - car.len; j--)
parking_lot[car.row][j] = car.num;
car.col = new_col;
return true;
}


int main(int argc, char **argv) {
ifstream in(argv[1]);
ifstream sol(argv[2]);
ifstream out(argv[3]);

in >> n;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
in >> parking_lot[i][j];

for (int i = 0; i < n; i++)
for (int j = n-1; j >= 0; j--) {
if (parking_lot[i][j] == 0)
checked[i][j] = true;
if (checked[i][j])
continue;
int len = 1;
if (i != n-1 && parking_lot[i][j] == parking_lot[i+1][j]) {
for (int k = i+1; k < n && parking_lot[i][j] == parking_lot[k][j]; k++) {
len++;
checked[k][j] = true;
}
cars[parking_lot[i][j]] = Car(parking_lot[i][j], i, j, len, true);
}
else {
for (int k = j-1; k >= 0 && parking_lot[i][j] == parking_lot[i][k]; k--) {
len++;
checked[i][k] = true;
}
cars[parking_lot[i][j]] = Car(parking_lot[i][j], i, j, len, false);
}
}

read_int(out, k);

/*
유저가 제출한 K 값이 정답과 일치하는지 확인 - 부분점수 문제이므로 필요 없음.

int sol_k;
sol >> sol_k;
assert(k == sol_k);
*/

for (int i = 0; i < k; i++) {
read_int(out, x);
read_int(out, d);
assert(move_car(cars[x], d));
}
assert(car1exit);

string tmp;
assert(!(out >> tmp));

for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (parking_lot[i][j] != 0)
cout << setw(2) << parking_lot[i][j] << ' ';
else
cout << setw(2) << '*' << ' ';
}
cout << '\n';
}

return 0;
}