解题思路:1.
我们假设现在最小的圆盘在a柱子上,柱子为a,b,c
第一步:将最小圆盘移动到下一个柱子上,也就是b
第二步:对a柱子和c柱子进行顶上最小的元素进行判断,把小一点的那个圆盘移动到大一点的那个圆盘(有空则摞在空柱子上)。
重复上述两步就可以得到答案。
注意:这样得到的最后的答案不一定是摞在c上,如果N是偶数将摞在b上,所以如果N是偶数我们就令第二个柱子为c,第三个柱子为b,这样就一定最后是摞在c上的。
2.不过这个还是没通过最后一项大N的测试,提示输出超限
1 #include<stdio.h> 2 #include<stdlib.h> 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[topc] || c[topc]==0) 39 { 40 //如果a的最小值<c的最小值或者c为空,则将a的最小值移到c 41 temp = a[topa--]; 42 c[++topc] = temp; 43 printf("a -> 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[topc] || b[topb]==0) 72 { 73 temp = a[topa--]; 74 b[++topb] = temp; 75 printf("a -> 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[topc] || c[topc]==0) 93 { 94 temp = b[topb--]; 95 c[++topc] = temp; 96 printf("b -> c\n"); 97 count++; 98 if(count==n) 99 { 100 break; 101 } 102 } 103 else 104 { 105 temp = c[topc--]; 106 b[++topb] = temp; 107 printf("c -> b\n"); 108 count--; 109 } 110 111 } 112 } 113 114 else 115 { 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]<c[topc] || c[topc]==0) 129 { 130 temp = a[topa--]; 131 c[++topc] = temp; 132 printf("a -> b\n"); 133 134 } 135 else 136 { 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]<b[topc] || b[topb]==0) 151 { 152 temp = a[topa--]; 153 b[++topb] = temp; 154 printf("a -> c\n"); 155 count++; 156 if(count==n) 157 { 158 break; 159 } 160 } 161 else 162 { 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]<c[topc] || c[topc]==0) 177 { 178 temp = b[topb--]; 179 c[++topc] = temp; 180 printf("c -> b\n"); 181 count--; 182 } 183 else 184 { 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 }
代码有点又臭又长,还没有完全通过测试盼路过的大神指导!!