RxC 전체 격자판 크기 (2~100), row 행, col 열, (R,C)는 마지막 칸 = 행렬 1부터 시작함
1칸에 한 마리 상어 有
M 상어의 수 (0~RxC)
상어 속성 (위치, 속력, 방향, 크기) = (r c, s, d, z)
위치는 1초마다 변함
속도는 이동 방향 + 속력을 가짐, 속력은 부동, 방향은 격자판의 경계를 넘는 경우 반대가 됨
크기는 부동
이동 방향 (d) : 1(위) 2(아래) 3(오른쪽) 4(왼쪽)
낚시 과정
-사람은 오른쪽 열로 1칸씩 이동
-각 위치에서 가장 가까운 상어를 잡는다.
-상어 이동 (한 칸에 두 마리 이상이 되면 크기가 큰 상어만 유지) (같은 크기의 상어는 없음)
원하는 것 = 사람이 낚시를 마친 후 잡은 상어의 크기의 합을 반환
input_1 R,C,M 입력받기
input_2 상어의 정보(r,c,s,d,z) M번 입력받기
do{
사람 한칸 오른쪽 열로 이동하기
해당 열에서 row 값이 가장 작은 상어 선택하기
상어 삭제 + 상어 크기 결과에 +
상어의 방향과 속력에 맞추어 이동시키고 정보 업데이트
}while(사람이 C+1이 될 때)
output 상어의 크기 반환하기
#include <iostream>
#include <cstring>
using namespace std;
struct shark{
int s,d,z;
};
int R,C,M;
shark Arr[100][100];
int Dr[4] = {-1,1,0,0};
int Dc[4] = {0,0,1,-1};
int solve(){
int res = 0;
shark backup[100][100];
for(int t = 0; t < C; t++){
for(int i = 0; i < R; i++){
if(Arr[i][t].z >0){
res += Arr[i][t].z;
Arr[i][t].z = 0;
break;
}
}
memcpy(backup, Arr, sizeof(Arr));
memset(Arr,0, sizeof(Arr));
for(int i = 0; i < R; i++){
for(int j = 0; j < C; j++){
shark& curr = backup[i][j];
if(curr.z > 0){
int nr = i + curr.s*Dr[curr.d];
int nc = j + curr.s*Dc[curr.d];
if(nr < 0){
nr *= (-1);
curr.d = 1;
}else if(nc < 0){
nc *= -1;
curr.d = 2;
}
if(nr > R-1){
int a = nr/(R-1), b = nr%(R-1);
if(a%2 == 0){
nr = b;
}else{
nr = R-1 -b;
curr.d = 0;
}
}else if(nc > C-1){
int a = nc/(C-1), b = nc%(C-1);
if(a%2 == 0){
nc = b;
}else{
nc = C-1 -b;
curr.d = 3;
}
}
if(Arr[nr][nc].z < curr.z){
Arr[nr][nc] = curr;
}
}
}
}
}
return res;
}
int main()
{
cin >> R >> C >> M;
for(int i = 0; i < M; i++){
int r,c,s,d,z;
cin >> r >> c >> s >> d >> z;
Arr[r-1][c-1] = {s,d-1,z};
}
cout << solve() << endl;
return 0;
}
백업_0530_pm6:00 구현 완료
상어 이동할 때 벡터에 이상한 값이 추가되서 결과값이 이상하게 나옴, 예제 1 수행시 98456460나옴,,,말이안됨
그리고 코드 길이 너무 김
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
#define INF 98456451
struct shark{
int r,c,s,d,z;
};
int R,C,M;
vector<shark> s_list;
int Dr[4] = {-1,1,0,0};
int Dc[4] = {0,0,1,-1};
void shark_move(){
shark visited[R][C];
memset(visited, 0, sizeof(visited));
for(int i = 0; i < s_list.size(); i++){
//int nr = s_list[i].r, nc = s_list[i].c;
int speed = s_list[i].s, dir = s_list[i].d, size = s_list[i].z;
int nr = s_list[i].r + speed*Dr[dir];
int nc = s_list[i].c +speed*Dc[dir];
if(nr < 0){//위로 벗어나는 경우
nr *= -1;
dir = 1;//아래로 방향 전환
}else if(nc < 0){//왼쪽으로 벗어나는 경우
nc *= -1;
dir = 2;//오른쪽으로 방향 전환
}
if(nr > R-1){
int a = nr/(R-1), b = nr%(R-1);
if(a%2 == 0){//방향 그대로
nr = b;
}else{
nr = (R-1) - b;
dir = 0;//위로 방향 전환
}
}else if(nc > C-1){
int a = nc/(C-1), b = nc%(C-1);
if(a%2 == 0){//방향 그대로
nc = b;
}else{
nc = (C-1) - b;
dir = 3;//왼쪽으로 방향 전환
}
}
shark temp = visited[nr][nc];
if(temp.z != 0 && size < temp.z){//기존의 물고기가 클때
}else{//물고기 없거나 새로운 물고기가 클 때
visited[nr][nc] = {nr, nc, speed, dir, size};
}
}
s_list.clear();
for(int i = 0; i < R; i++){
for(int j = 0; j < C; j++){
if(visited[i][j].z == 0) continue;
shark temp = visited[i][j];
s_list.push_back(temp);
}
}
return;
}
int solve(){
int res = 0;
int W_loc = 0;
do{
//상어 선택
int dis = INF, size = INF;
for(int i = 0; i < s_list.size(); i++){
int nr = s_list[i].r, nc = s_list[i].c;
if(nc == W_loc){
dis = min(dis, nr);
size = s_list[i].z;
}
}
for(auto iter = s_list.begin(); iter != s_list.end(); ){
if((*iter).z == size){
iter = s_list.erase(iter);
break;
}else iter++;
}
res += dis;
//상어 이동
shark_move();
//열 한칸 옮기기
W_loc++;
}while(W_loc<C);//낚시꾼이 범위 벗어날 때
return res;
}
int main()
{
cin >> R >> C >> M;
for(int i = 0; i < M; i++){
int r,c,s,d,z;
cin >> r >> c >> s >> d >> z;
s_list.push_back({r-1,c-1,s,d-1,z});
}
cout << solve() << endl;
return 0;
}