Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 시간 복잡도
- 스택의 특징
- 자료구조
- qorwns
- 백준
- 백준 17822
- 백준 17779
- AVL 시간 복잡도
- heap
- 원판 돌리기
- ㅣ풀이
- 백준 2447
- 백준 1406
- 별 찍기 10
- 1764
- 백준 1158
- 풀이
- 해시구현
- 5397
- 조세퍼스 순열
- 백준 5397
- Stack 이란
- dfs
- 버킷 정렬
- 게리멘더링2
- c#
- C/C++ 구현
- 구현
- 백준 17471
- 해시 구현
Archives
- Today
- Total
홍시홍의 프로그래밍
[백준 1936] 소수 경로 본문
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