ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [게임알고리즘] 6강 최단경로
    [DSU] 게임알고리즘 2026. 4. 10. 18:33
    728x90

    다익스트라 알고리즘

     

    Main.cpp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #include "ShortestPath.h"
     
    #define I 0xFFFFFF
     
    int tile[] = {
       1111111111
       1, I, 11111, I, 11
       1111111111
       1111, I, 11111
       11111, I, I, 111
       1111111111
       1111111111
       1111111111
    };
     
    int main() {
        SP sp(100);
        
        int path[100], pathNum;
        int test[3][2= { {012}, {111}, {420} };
        for(int i=0; i<3; i++)
        {
            int* t = test[i];
            sp.run(tile, 108, t[0], t[1], path, pathNum);
            printf("== s(%d) e(%d) %d\n", t[0], t[1], pathNum);
            for(int j=0; j<pathNum; j++)
                printf("%d %s", path[j], j<pathNum-1 ? "=>":"\n");
        }
     
        return 0;
    }
     
    cs

     

     

    ShortestPath.h

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #include <stdio.h>
    #include <string.h>
     
    #define TW 32
    #define TH 32
     
    struct Node {
        bool v;// visit
        int n;// value
        int* p;
        int pNum;
    };
     
    struct Point {
        float x, y;
    };
     
    struct SP
    {
        SP(int wh);
        virtual ~SP();
        
        int wh;
        Node* node;
        
        void run(int* data, int w, int h, 
                int start, int endint* path, int& pathNum);
                
        void run(int* data, int w, int h, 
                Point start, Point end, Point* path, int& pathNum);
    };
    cs

     

     

    ShortestPath.cpp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    #include "ShortestPath.h"
     
    SP::SP(int wh)
    {
        node = new Node[wh];
        this->wh = wh;
    }
     
    SP::~SP()
    {
        delete node;
    }
     
    void SP::run(int* data, int w, int h, 
                int start, int endint* path, int& pathNum)
    {
        int wh = w*h;
        ifthis->wh < wh )
        {
            delete node;
            node = new Node[wh];
            this->wh = wh;
        }
        for(int i=0; i<wh; i++)
        {
            Node* n = &node[i];
            n->= false;
            n->= I;
            n->= new int[wh/2];
            n->pNum = 0;
        }
        Node* n = &node[start];
        //n->v = true;
        n->= 0;
        n->p[0= start;
        n->pNum = 1;
        
        for(;;)
        {
            // 방문하지 않은곳들 중에서 가장 비용이 싼곳 찾는다.
            int min = 0xffffff;
            int curr = -1;
            for(int i=0; i<wh; i++)
            {
                if( node[i].v==false &&
                    node[i].n < min )
                {
                    min = node[i].n;
                    curr = i;
                }
            }
            
            // 더 이상 방문할곳이 없으면 나간다.
            if( curr==-1 ) break;
            
            node[curr].v = true;
            
            // 4방향에 대해서 각각 비용을 계산해서 더 작으면 갱신한다.
            int x = curr % w;
            int y = curr / w;
            
    #if 0
            int dy[] = { -11, w, -w };
            for (int i = 0; i < 4++i)
            {
                int nextV = curr + dy[i];
                if ((i == 0 && x == 0||
                    (i == 1 && x == w - 1||
                    (i == 2 && y == 0||
                    (i == 3 && y == h - 1))
                    continue;
                
                Node* d = &node[nextV];
                Node* s = &node[curr];
                
                if( d->> s->+ tile[nextV] )
                {
                    d->= s->+ tile[nextV];
                    memcpy(d->p, s->p, sizeof(int* s->pNum);
                    d->p[ s->pNum ] = nextV;
                    d->pNum = s->pNum + 1;
                }
            }
    #else
    #define exe(con, nextV)                         \
            if( con )                               \
            {                                       \
                Node* d = &node[nextV];            \
                Node* s = &node[curr];              \
                if( d->> s->+ tile[nextV] )    \
                {                                   \
                    d->= s->+ tile[nextV];     \
                    memcpy(d->p, s->p, sizeof(int* s->pNum);\
                    d->p[ s->pNum ] = nextV;       \
                    d->pNum = s->pNum + 1;          \
                }                                   \
            }
            exe(x > 0, curr-1);
            exe(x < w-1, curr+1);
            exe(y > 0, curr-w);
            exe(y < h-1, curr+w);
    #endif
        }// for(;;)
        
        n = &node[end];
        memcpy(path, n->p, sizeof(int* n->pNum);
        pathNum = n->pNum;
    }
     
    void SP::run(int* data, int w, int h, 
                Point start, Point end, Point* path, int& pathNum)
    {
        int s = w * (start.y / TH) + start.x / TW;
        int e = w * (end.y / TH) + end.x / TW;
        int* p = new int[w * h / 2];
        run(data, w, h, s, e, p, pathNum);
        for(int i=1; i<pathNum - 1; i++)
        {
            path[i].x = TW * (p[i] % w) + TW / 2;
            path[i].y = TH * (p[i] / w) + TH / 2;
        }
        path[0= start;
        path[pathNum-1= end;
    }
    cs

     

     

    매일매일 열심히 게임개발하고 있습니다

     

Designed by Tistory.