로곡 P1242 신한노타 dfs 귀속
38148 단어 DFS
90분 코드:
우선 번호가 비교적 큰 것이 목표 위치에 도달하는 것을 보장하고 다른 번호가 비교적 작은 접시를 먼저 중간 기둥으로 옮긴다.
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX 50
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
//p1 ,p2
int n,p1[MAX],p2[MAX],ans=0;
void dfs(int id,int pos1,int pos2){
if(pos1==pos2){//
return;
}
for(int i=id-1;i>=1;i--){// id
dfs(i,p1[i],6-pos1-pos2);
}
p1[id]=pos2;
printf("move %d from %c to %c
",id,'A'+pos1-1,'A'+pos2-1);
ans++;
}
int main(){
scanf("%d",&n);
int k,x;
scanf("%d",&k);for(int i=0;i<k;i++){scanf("%d",&x);p1[x]=1;}
scanf("%d",&k);for(int i=0;i<k;i++){scanf("%d",&x);p1[x]=2;}
scanf("%d",&k);for(int i=0;i<k;i++){scanf("%d",&x);p1[x]=3;}
scanf("%d",&k);for(int i=0;i<k;i++){scanf("%d",&x);p2[x]=1;}
scanf("%d",&k);for(int i=0;i<k;i++){scanf("%d",&x);p2[x]=2;}
scanf("%d",&k);for(int i=0;i<k;i++){scanf("%d",&x);p2[x]=3;}
for(int i=n;i>=1;i--){
dfs(i,p1[i],p2[i]);// i
}
printf("%d",ans);
return 0;
}
시뮬레이션 퇴화도 가능(확률론?),근데 저는 잘 못해요.
AC 아이디어:
n호 접시에 대해 두 가지 이동 방안이 있다. (1) 먼저 중간 기둥으로 이동한 다음에 목표 기둥으로 이동한다(2) 목표 기둥으로 직접 이동한다. 우리는 두 가지 방안의 최소치를 취하면 된다.
AC 코드:
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX 50
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
struct node{
int id;
int s;
int f;
}t_mov[1000005],mov[1000005];
//p1 ,p2
int n,p1[MAX],p2[MAX],t1[MAX],t2[MAX],minl=INF,ans=0;
void dfs(int id,int pos1,int pos2){
if(pos1==pos2){//
return;
}
for(int i=id-1;i>=1;i--){// id
dfs(i,t1[i],6-pos1-pos2);
}
t1[id]=pos2;
ans++;
t_mov[ans].id=id,t_mov[ans].s=pos1,t_mov[ans].f=pos2;
}
int main(){
scanf("%d",&n);
int k,x;
scanf("%d",&k);for(int i=0;i<k;i++){scanf("%d",&x);p1[x]=1;}
scanf("%d",&k);for(int i=0;i<k;i++){scanf("%d",&x);p1[x]=2;}
scanf("%d",&k);for(int i=0;i<k;i++){scanf("%d",&x);p1[x]=3;}
scanf("%d",&k);for(int i=0;i<k;i++){scanf("%d",&x);p2[x]=1;}
scanf("%d",&k);for(int i=0;i<k;i++){scanf("%d",&x);p2[x]=2;}
scanf("%d",&k);for(int i=0;i<k;i++){scanf("%d",&x);p2[x]=3;}
for(int i=1;i<=2;i++){// , 1 , 2
ans=0;
for(int j=1;j<=n;j++){//t1,t2
t1[j]=p1[j];
t2[j]=p2[j];
}
if(i==1) dfs(n,t1[n],t2[n]);//
else dfs(n,t1[n],6-t1[n]-t2[n]);
for(int j=n-1;j>=1;j--){
dfs(j,t1[j],t2[j]);
}
for(int j=n;j>=1;j--){
dfs(j,t1[j],t2[j]);
}
if(i==2){// , n
for(int j=n;j>=1;j--){
dfs(j,t1[j],t2[j]);
}
}
if(ans<minl){
for(int j=1;j<=ans;j++){
mov[j]=t_mov[j];
}
minl=ans;
}
}
for(int i=1;i<=minl;i++){
printf("move %d from %c to %c
",mov[i].id,'A'+mov[i].s-1,'A'+mov[i].f-1);
}
printf("%d",minl);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[BOJ] 5568 카드 놓기아이디어 Level이 0일 때, 즉 아직 카드를 고르지 않았을 때 StringBuilder를 생성하고 sb에 고른 카드를 담도록 하였다. 이후 해당 노드 탐색을 종료하면 sb에 담은 카드를 삭제해 주었다....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.