메뉴 건너뛰기

Programing

Code Up

3120

관리자 2019.12.20 19:28 조회 수 : 8

C++

DFS

#include <cstdio>

#include <cstdlib>

#include <algorithm>

#include <cstring>

using namespace std;

 

int Now,Final;

 

 

int min_=1000000;

void DFS(int n,int t){

    if(n==Final)

    {

        if(min_ > t)

            min_ = t;

        return;

    }

    if(t>=min_)

        return;

 

    if(n>Final){

        DFS(n-1,t+1);

        DFS(n-5,t+1);

        DFS(n-10,t+1);

    }else{

        DFS(n+1,t+1);

        DFS(n+5,t+1);

        DFS(n+10,t+1);

    }

}

 

 

int main()

{

    scanf("%d %d",&Now,&Final);

    DFS(Now,0);

    printf("%d",min_);

    return 0;

}

BFS

#include <cstdio>

#include <cstdlib>

#include <algorithm>

#include <queue>

#include <cstring>

using namespace std;

int Now,Final;

 

queue<int> q;

int t=0;

void BFS(){

    q.push(Now);

    while(!q.empty()){

        size_t size_=q.size();

        for(size_t i=0;i<size_;i++){

 

            int n=q.front();

            q.pop();

 

            if(n==Final){

                return;

            }

            q.push(n-1);

            q.push(n-5);

            q.push(n-10);

            q.push(n+1);

            q.push(n+5);

            q.push(n+10);

 

        }

        if(!q.empty())

            t++;

    }

}

 

int main()

{

    scanf("%d %d",&Now,&Final);

    BFS();

    printf("%d",t);

    return 0;

}

DP

#include <cstdio>

#include <cstdlib>

#include <algorithm>

#include <queue>

#include <cstring>

using namespace std;

int dt[70];

int Now,Final;

 

 

const int INF = 100;

const int offset = 10;

int dx[] = {-1, -5, -10, 1, 5, 10};

int dp()

{

    if(Now > Final)

        swap(Now, Final);

    int s = Now - offset;

    if(s < 0)

    {

        Now += -s;

        Final += -s;

        s = 0;

    }

    int e = Final + offset;

 

    for(int i = s; i <= e; ++i)

        dt[i] = INF;

 

    dt[Now] = 0;

    for(int k = 0; k < 6; ++k)

        dt[Now + dx[k]] = 1;

    for(int i = s; i <= e; i++){

        for(int k = 0; k < 6; ++k)

        {

            if(i + dx[k] >= s && i + dx[k] <= e)

                dt[i + dx[k]] = min(dt[i + dx[k]], dt[i] + 1);

        }

    }

    return dt[Final];

}

 

int main()

{

    scanf("%d %d",&Now,&Final);

    printf("%d",dp());

    return 0;

}

 

번호 제목 글쓴이 날짜 조회 수
공지 안내사항 관리자 2019.12.02 175
172 3703 관리자 2019.12.20 8
171 3701 관리자 2019.12.20 9
170 3520 관리자 2019.12.20 8
» 3120 관리자 2019.12.20 8
168 3023 관리자 2020.04.06 60
167 3022 관리자 2020.04.06 51
166 3021 관리자 2020.04.06 63
165 3009 관리자 2019.12.20 8
164 3008 관리자 2019.12.20 6
163 3007 관리자 2019.12.20 7
162 3006 관리자 2019.12.20 14
161 2748 관리자 2019.12.20 9
160 2657 관리자 2019.12.20 21
159 2652 관리자 2019.12.20 7
158 2641 관리자 2019.12.20 7
157 2634 관리자 2019.12.20 6
156 1953 관리자 2019.12.20 7
155 1936 관리자 2019.12.20 7
154 1925 관리자 2019.12.20 7
153 1525 관리자 2019.12.20 9
152 1505 관리자 2019.12.20 7
151 1476 관리자 2019.12.20 3
150 1162 관리자 2019.12.20 7
149 1161 관리자 2019.12.20 7
148 1160 관리자 2019.12.20 7
147 1159 관리자 2019.12.20 5
146 1158 관리자 2019.12.20 5
145 1157 관리자 2019.12.20 10
144 1156 관리자 2019.12.20 7
143 1155 관리자 2019.12.20 5
위로