Do Something

로봇이 두대이상 움직인다 본문

코딩 과제

로봇이 두대이상 움직인다

뭐라도해야겠다 2021. 1. 13. 01:22

이번엔 로봇이 한대가 아니라 두대인 문제다.

로봇이 특정 점에서 시작해서 반대로 움직인다. 그러다가 만나면 방향을 바꾸고 움직인다. 

점에서 만날수도 있지만, 서로 지나가다가 점 중간에서 만나면 바로 방향을 바꾼다.

 

이거같은 경우에 처음에 보고 쉬울줄 알았다.

 

그냥 로봇 한대 움직이는거 두대로 만들고 go함수 써서 만나면 목표를 바꾸면 되겠지 쉽네

라고 생각을 했는데 어림도없지 ㅋㅋ

 

대충 go로 만나는건 코딩을 하면서 문제가 생겼는데

내가 전에 짜둔 go함수가 어떻게 생겼냐면

 

    int go(Point com) {
        if (x == com.GetX() && y == com.GetY()) return 1;
        if (x - com.GetX() == 0) {
            if (y - com.GetY() < 0) {this->y += 1; return 0;}
            else {this->y -= 1;return 0;}}
        if (x - com.GetX() < 0) {this->x += 1;return 0;}
        else {this->x -= 1;return 0;}
    }

 

이렇게 생겼다. 

현재의 Point를 com(pare)이라는 point를 향해서 x나 y를 바꿔주는 함수였다.

이렇게 하다보니 특정 xy좌표를 비교할 수는 있지만 지나가는 순간을 비교할 수는 없다. 

 

그리고 서로 방향이 다르므로 전에 로봇움직이는 함수를 정방향과 역방향으로 나누어야 했다. 

2대까지라면 괜찮겠지만, 문제의 원형은 3대였다. 3대라면 답이 없어진다. 3대에서 2대로 교수님이 줄여주신거라....

이때 해둔 코드로는 3대는 커버 불가능이다. 그래도 2대니까 일단 2대로 해보자

 

문제점은 로봇이 같은 점에서 만난다면 수월하지만, 그 중간에서 만난다면 캐치를 못한다는 점이다.

그래서 중간에 만나는 경우를 처리해줘야 했다.

 

중간에서 만나는 경우가 뭐가 있을까? 라고 생각을 해보면 

점 두개의 차이가 오직 1이 나는 경우이다. 

 

점 두개의 차이가 1이 날 떄, 시간을 그냥 1을 줄여주고 로봇이 향하는 점의 목표를 바꿔주면 된다.

목표를 바꿔주면, 즉 2번점으로 가던걸 1번점으로 향하게 하면 방향이 바뀌기 떄문이다.

 

그래서 해야했던게

1. 정방향 함수, 역방향 함수

2. 점 두개거리 1임을 감지해주는 함수

3.목표를 바꿔주며 움직이는 함수

를 만들었다.

근데 이거 하다보면 코드 겁나 길어지더라

 

void where(Point start, Point start2, Point* vertex, int num, int time, int wh1, int wh2) {
    int i = wh1,j = wh2, move = 1,t=1,bo = 0;
    while (time > 0) {
        if (move) {
            bo = mi(i, j, num);
            gof(start, vertex, i, num);
            gob(start2, vertex, j, num);
            if (bo) {
                shallmove(start, start2, i, j, num, move, time);
            }
            bo = 1;
        }
        else {
            bo = mi(i, j, num);
            gob(start, vertex, i, num);
            gof(start2, vertex, j, num);
            if (bo) {
                shallmove(start2, start, j, i, num, move, time);
            }
            bo = 1;
        }
        time--;
    }
    start.show();
    cout << endl;
    start2.show();
}

 

앞으로 가는, 뒤로가는 함수 gof,gob를 만들고 1차이가 나는지 안나는지, 점이 같은지를 확인해준 다음에 부딫치면 방향을 바꿔준다. 

이렇게 하니까 복잡하다. 

직접 하나하나 다 확인을 해줘야 하며, 여기에는 안적었지만 중간중간에 확인을 해주는 과정이 필요해서 함수가 2~3개정도 더 쓰인다. 

 

그래서 그냥 새로 짜보자.

로봇이 몇대든 상관없이 만들려면 어떻게 해야할까

강의에서 들었던 내용인데 깃발을 하나씩 가지고 있다고 생각을 하고, 로봇을 만나면 그 깃발을 서로 교환해주면 된다. 

그러면 그냥 로봇들을 냅둬도 알아서 부딫친것처럼 되고, 나중에 확인을 할떄 1번깃발 2번깃발 이런식으로 확인을 해주면 된다.

골떄린다

ㅋㅋㅋㅋㅋㅋ

또 선분의 길이를 생각해서 한번에 계산을 해주는것도 가능하다. 

점을 쫙 받아놓고 길의 길이가 30이라고 할떄, 쭉 펼쳐놓은 상태에서 50초 뒤의 위치는 30만큼 돌고 20초 뒤라고 보면 되는것과 같으니까 그렇게 풀어주면 1초씩 기다릴필요없이 한번에 계산이 가능하다. 

 

음 그래도 2대니까 2대에 최적화해서 만들어보자

목표는 점 받아서 단번에 계산하기

 

어디서 부딫치는지 안다면 곧바로 계산이 가능할텐데 어렵네

내일하도록 하자

 

 

 

 

 

 

 

'코딩 과제' 카테고리의 다른 글

로봇이 움직이는 문제  (0) 2021.01.11