POJ 1920 Towers of Hanoi G++汉诺塔 背

xiaoxiao2021-02-28  112

#include <iostream> #include <cstdio> #include <cstring> using namespace std; //看博友分析重要 抄博友程序 改博友程序 汉诺塔 背 /* int main() { int T,i,j,n,m; int a[5],b[100005],c[100005]; while(~scanf("%d",&T)) { for(i=1; i<=3; i++) scanf("%d",&a[i]); for(i=1; i<=3; i++) { for(j=1; j<=a[i]; j++) { scanf("%d",&n); b[n]=i; //记录每个盘子所在的柱子位置 } } c[0]=1; for(i=0; i<T; i++) c[i+1]=(c[i]*2)00000; int s1=b[T],s2=b[T-1],s=0; //s1为最大的盘子位置,s2为第二大的盘子位置 //移动盘子从小到大移动 for(i=T-1; i>0; i--) { if(s1!=s2) //假如盘子不在正确的位置上,将其移动 { s=(s+c[i-1])00000; s2=6-s1-s2; //修改博友程序wa 记录剩余盘子新的位置 }else{ s2=b[i]; //修改博友程序wa } } printf("%d\n%d\n",b[T],s); } return 0; }*/ int a[100008]; int b[100008]; int mi[100008]; int mod=1000000; int main() { mi[0]=1; for(int i=1;i<=100000;i++) { mi[i]=mi[i-1]*2%mod; } int n; cin>>n; for(int i=1;i<=3;i++) { cin>>a[i]; } for(int i=1;i<=3;i++) { for(int j=1;j<=a[i];j++) { int t; cin>>t; b[t]=i;//抄博友程序 } } int s1=b[n]; int jg=0; //移动盘子从小到大 for(int i=n-1;i>=1;i--) { int s2=b[i]; if(s1!=s2) { jg=(jg+mi[i-1])%mod; s1=6-s1-s2; } } cout<<b[n]<<endl; cout<<jg<<endl; return 0; }

 

转载请注明原文地址: https://www.6miu.com/read-36935.html

最新回复(0)