解题思路:1.
我们假设现在最小的圆盘在a柱子上,柱子为a,b,c
第一步:将最小圆盘移动到下一个柱子上,也就是b
第二步:对a柱子和c柱子进行顶上最小的元素进行判断,把小一点的那个圆盘移动到大一点的那个圆盘(有空则摞在空柱子上)。
重复上述两步就可以得到答案。
注意:这样得到的最后的答案不一定是摞在c上,如果N是偶数将摞在b上,所以如果N是偶数我们就令第二个柱子为c,第三个柱子为b,这样就一定最后是摞在c上的。
2.不过这个还是没通过最后一项大N的测试,提示输出超限
1 #include2 #include 3 4 int main() 5 { 6 int i; 7 int n; 8 int topa = -1; 9 int topb = -1; 10 int topc = -1; 11 int temp; 12 int to = 1; //用to表示当前最小值所在的柱子,1为a,2为b 13 int count ; 14 scanf("%d",&n); 15 int a[n]; 16 int b[n]; 17 int c[n]; 18 19 count = 0; //如果n是偶数,那运行完成后C柱上有n个元素,奇数的话B柱上有n个元素 20 21 for( i=n; i>0; i--) 22 { 23 a[++topa] = i; //初始化低层数值大 24 25 } 26 while( 1 ) 27 { 28 if( n%2==0) 29 { 30 //这里主要处理n为偶数第一步放在b上 31 if( to==1) 32 { 33 //当前最小值在a上,往前移一步 34 temp = a[topa--]; 35 b[++topb] = temp; 36 to = 2; 37 printf("a -> b\n"); 38 if( a[topa] c\n"); 44 count++; 45 if(count==n) 46 { 47 break; 48 } 49 } 50 else 51 { 52 //否则将c的最小值移动到a 53 temp = c[topc--]; 54 a[++topa] = temp; 55 printf("c -> a\n"); 56 count--; 57 } 58 59 } 60 else if( to==2) 61 { 62 temp = b[topb--]; 63 c[++topc] = temp; 64 to = 3; 65 printf("b -> c\n"); 66 count++; 67 if(count==n) 68 { 69 break; 70 } 71 if( a[topa] b\n"); 76 } 77 else 78 { 79 temp = b[topb--]; 80 a[++topa] = temp; 81 printf("b -> a\n"); 82 } 83 84 } 85 else if( to==3) 86 { 87 temp = c[topc--]; 88 a[++topa] = temp; 89 to = 1; 90 printf("c -> a\n"); 91 count--; 92 if( b[topa] c\n"); 97 count++; 98 if(count==n) 99 {100 break;101 }102 }103 else104 {105 temp = c[topc--];106 b[++topb] = temp;107 printf("c -> b\n");108 count--;109 }110 111 }112 }113 114 else115 {116 //这里主要处理n为奇数第一步放在c上117 if( to==1)118 {119 temp = a[topa--];120 b[++topb] = temp;121 to = 2;122 printf("a -> c\n");123 count++;124 if(count==n)125 {126 break;127 }128 if( a[topa] b\n");133 134 }135 else136 {137 temp = c[topc--];138 a[++topa] = temp;139 printf("b -> a\n");140 }141 142 }143 else if( to==2)144 {145 temp = b[topb--];146 c[++topc] = temp;147 to = 3;148 printf("c -> b\n");149 count--;150 if( a[topa] c\n");155 count++;156 if(count==n)157 {158 break;159 }160 }161 else162 {163 temp = b[topb--];164 a[++topa] = temp;165 printf("c -> a\n");166 count--;167 }168 169 }170 else if( to==3)171 {172 temp = c[topc--];173 a[++topa] = temp;174 to = 1;175 printf("b -> a\n");176 if( b[topa] b\n");181 count--;182 }183 else184 {185 temp = c[topc--];186 b[++topb] = temp;187 printf("b -> c\n");188 count++;189 if(count==n)190 {191 break;192 }193 }194 195 }196 197 }198 }199 return 0;200 201 }
代码有点又臭又长,还没有完全通过测试盼路过的大神指导!!