홍시홍의 프로그래밍

[백준 1936] 소수 경로 본문

알고리즘 문제풀이/백준

[백준 1936] 소수 경로

홍시홍 2020. 2. 13. 23:49

https://www.acmicpc.net/problem/1963

 

1963번: 소수 경로

문제 소수를 유난히도 좋아하는 창영이는 게임 아이디 비밀번호를 4자리 ‘소수’로 정해놓았다. 어느 날 창영이는 친한 친구와 대화를 나누었는데: “이제 슬슬 비번 바꿀 때도 됐잖아” “응 지금은 1033으로 해놨는데... 다음 소수를 무엇으로 할지 고민중이야" “그럼 8179로 해” “흠... 생각 좀 해볼게. 이 게임은 좀 이상해서 비밀번호를 한 번에 한 자리 밖에 못 바꾼단 말이야. 예를 들어 내가 첫 자리만 바꾸면 8033이 되니까 소수가 아니잖아.

www.acmicpc.net

 

 

요구사항

최소 이동으로 n에서 m으로 변경

 

풀이

1. 4자리 수 소수 구한다

2. 한 자리씩 이동하면서 bfs로 최소이동 횟수 구한다

 

#include<iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <deque>
#include <string.h>
//#include <windows.h>
//#include <map>
using namespace std;

struct go{
    int x;
    int cnt;
};
int n;
int map[10000];
int visit[10000];
int startv,endv;
int ans=0;
void solve(){
    queue<go> q;
    q.push({startv,0});
    visit[startv]=1;
    while(!q.empty()){
        int now = q.front().x;
        int cnt = q.front().cnt;
        q.pop();
        //cout<<now<<endl;
        if(now==endv){
            ans=cnt;
            return;
        }
        int f = now / 1000;
        int s = now / 100;
        s = s%10;
        int t = now % 100;
        t = t/10;
        int fo = now%10;
        //1000부터
        for(int i=1 ; i<=9 ; i++){
            int nf=i*1000;
            int newnum= nf+s*100 + t*10 +fo;
          //  cout<<"nuw"<<newnum<<endl;
            if(visit[newnum]==0){
                visit[newnum]=1;
                q.push({newnum,cnt+1});
            }
        }
        //100
        for(int i=0 ; i<=9 ; i++){
            int nf=i*100;
            int newnum= f*1000 + nf+ t*10 +fo;
           // cout<<"nuw"<<newnum<<endl;
            if(visit[newnum]==0){
                visit[newnum]=1;
                q.push({newnum,cnt+1});
            }
        }
        //10
        for(int i=0 ; i<=9 ; i++){
            int nf=i*10;
            int newnum= f*1000 + s*100 + nf +fo;
           // cout<<"nuw"<<newnum<<endl;
            if(visit[newnum]==0){
                visit[newnum]=1;
                q.push({newnum,cnt+1});
            }
        }

        for(int i=0 ; i<=9 ; i++){
            int nf=i;
            int newnum= f*1000 + s*100 + t*10 +i;
         //   cout<<"nuw"<<newnum<<endl;
            if(visit[newnum]==0){
                visit[newnum]=1;
                q.push({newnum,cnt+1});
            }
        }
  //      cout<<f<<" "<<s<<" "<<t<<" "<<fo<<endl;
    }
}
void init(){
    memset(visit,0,sizeof(visit));
    for(int i=2; i <=9999; i++){
        int cnt=2;
        for(int j=cnt*i ; j<=9999; cnt++)
        { 
            if(visit[j]==0){
                visit[j]=1;
            }
            j=cnt*i;
        }
    }
}
int main(){
    int t;
    cin>>t;
    for(int tc=1;tc<=t;tc++){
        cin>>startv>>endv;
        ans=987654321;
        init();
        solve();
       // cout<<visit[8017]<<endl;
        if(ans==987654321){
            cout<<"Impossible"<<endl;
        }
        else{
            cout<<ans<<endl;
        }
    
    }

    
    
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 1213] 팰린드롬 만들기  (0) 2020.02.15
[백준 1431] 시리얼 번호  (0) 2020.02.15
[백준 16234] 인구 이동  (0) 2020.02.08
[백준 14890] 경사로  (0) 2020.02.08
[백준 14889] 스타트와 링크  (0) 2020.02.08
Comments