Advertisement
Guest User

Untitled

a guest
Mar 27th, 2017
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.74 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int stan(int *A, int *B, int *C, int atop , int btop ,int ctop);
  4. int zmiana(int *A, int*B, int *C, int atop, int btop, int ctop, int n, int max);
  5. int main()
  6. {
  7. int kroki=0;
  8. int n,i,*A,*B,*C,atop,btop,ctop;
  9. int max=1;
  10. while(n!=0)
  11. {
  12. max=1;
  13. printf("\nPodaj liczbe dyskow (wpisz 0 aby zakonczyc program): ");
  14. scanf("%d",&n);
  15. for(i=0; i<n; i++) max*=2;
  16. max=max-1;
  17. printf("\nMaksymalna liczba ruchow: %d",max);
  18. A= (int *)malloc(sizeof(int)*(n+1));
  19. B= (int *)malloc(sizeof(int)*(n+1));
  20. C= (int *)malloc(sizeof(int)*(n+1));
  21. A[0]=B[0]=C[0]=0;
  22. atop=btop=ctop=0;
  23. for(i=n; i>0; i--)
  24. {
  25. atop++;
  26. A[0]++;
  27. A[atop]=i;
  28. B[atop]=0;
  29. C[atop]=0;
  30. }
  31. stan(A,B,C,atop,btop,ctop);
  32. zmiana(A,B,C,atop,btop,ctop,n,max);
  33. printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
  34. printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
  35. printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
  36. }
  37. printf("~~~~~~Filip Szarejko~~~~~~~~\n");
  38. printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
  39. printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
  40. printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
  41. system("pause");
  42. return 0;
  43. }
  44. stan(int *A, int *B, int *C, int atop , int btop ,int ctop)
  45. {
  46. int i;
  47. if(A[0]==0) printf("\nPusty A");
  48. else
  49. {
  50. printf("\nKijek A :\n");
  51. for (i=atop; i>=1; i--) printf(" %d\n",A[i]);
  52. }
  53. if(B[0]==0) printf("\nPusty B");
  54. else
  55. {
  56. printf("\nKijek B: \n");
  57. for (i=btop; i>=1; i--) printf(" %d\n",B[i]);
  58. }
  59.  
  60. if(C[0]==0) printf("\nPusty C\n");
  61. else
  62. {
  63. printf("\nKijek C: \n");
  64. for (i=ctop; i>=1; i--) printf(" %d\n",C[i]);
  65. }
  66. }
  67. int zmiana(int *A, int*B, int *C, int atop, int btop, int ctop, int n, int max)
  68. {
  69. int kroki=0,ruch=0;
  70. do
  71. {
  72. ruch+=1;
  73. kroki=(kroki%3)+1;
  74. switch(kroki)
  75. {
  76. case 1://ruch kijkow A i C
  77. printf("\n%d.) Ruch",ruch);
  78. if(ruch%2 ==1)//Ruch dysku 1
  79. {
  80. if(A[atop]==1)
  81. {
  82. ctop++;
  83. C[ctop]=A[atop];
  84. A[atop]=0;
  85. atop--;
  86. C[0]++;
  87. A[0]--;
  88. printf("\ndysk %d: A->C",C[ctop]);
  89. } //i jest na A
  90. else if(C[ctop]==1)//1 jest na b
  91. {
  92. atop++;
  93. A[atop]=C[ctop];
  94. C[ctop]=0;
  95. ctop--;
  96. A[0]++;
  97. C[0]--;
  98. printf("\ndysk %d: C->A",A[atop]);
  99. }
  100. }//ruch dysku 1
  101.  
  102. else if(ruch %2 ==0)
  103. {
  104. if(ctop !=0 && A[atop]>C[ctop])
  105. { //C[0]--;
  106. atop++;
  107. A[atop]=C[ctop];
  108. C[ctop]=0;
  109. ctop--;
  110. C[0]--;
  111. A[0]++;
  112. printf("\ndysk %d: C->A",A[atop]);
  113. }
  114. else if (ctop ==0)
  115. {
  116. ctop++;
  117. C[ctop]=A[atop];
  118. A[atop]=0;
  119. atop--;
  120. C[0]++;
  121. A[0]--;
  122. printf("\n dysk %d:A->C",C[ctop]);
  123. }
  124. else if(atop !=0 && C[ctop]>A[atop])
  125. {
  126. ctop++;
  127. C[ctop]=A[atop];
  128. A[atop]=0;
  129. atop--;
  130. C[0]++;
  131. A[0]--;
  132. printf("\ndysk %d: A->C",C[ctop]);
  133. }
  134. else if(atop==0)
  135. {
  136. atop++;
  137. A[atop]=C[ctop];
  138. C[ctop]=0;
  139. ctop--;
  140. C[0]--;
  141. A[0]++;
  142. printf("\ndysk %d: C->A",A[atop]);
  143. }
  144. }//ruch innych dyskow
  145. break;
  146. case 2://ruch kijkow A i B
  147. printf("\n%d.) Ruch",ruch);
  148. if(ruch%2 ==1)//move of dysk 1
  149. {
  150. if(A[atop]==1)
  151. {
  152. btop++;
  153. B[btop]=A[atop];
  154. A[atop]=0;
  155. atop--;
  156. B[0]++;
  157. A[0]--;
  158. printf("\ndysk %d: A->B",B[btop]);
  159. } //i jest na A
  160. else if(B[btop]==1)//1 jest na b
  161. {
  162. atop++;
  163. A[atop]=B[btop];
  164. B[btop]=0;
  165. btop--;
  166. A[0]++;
  167. B[0]--;
  168. printf("\ndysk %d: B->A",A[atop]);
  169. }
  170. }//ruch dysku 1
  171. else if(ruch %2 ==0)
  172. {
  173. if(btop !=0 && A[atop]>B[btop])
  174. { //B[0]--;
  175. atop++;
  176. A[atop]=B[btop];
  177. B[btop]=0;
  178. btop--;
  179. B[0]--;
  180. A[0]++;
  181. printf("\ndysk %d: B->A",A[atop]);
  182. }
  183. else if (btop ==0)
  184. {
  185. btop++;
  186. B[btop]=A[atop];
  187. A[atop]=0;
  188. atop--;
  189. B[0]++;
  190. A[0]--;
  191. printf("\n dysk %d:A->B",B[btop]);
  192. }
  193. else if(atop !=0 && B[btop]>A[atop])
  194. {
  195. btop++;
  196. B[btop]=A[atop];
  197. A[atop]=0;
  198. atop--;
  199. B[0]++;
  200. A[0]--;
  201. printf("\ndysk %d: A->B",B[btop]);
  202. }
  203. else if(atop==0)
  204. {
  205. atop++;
  206. A[atop]=B[btop];
  207. B[btop]=0;
  208. btop--;
  209. B[0]--;
  210. A[0]++;
  211. printf("\ndysk %d: B->A",A[atop]);
  212. }
  213. }//ruch innych dyskow
  214. break;
  215. case 3://ruch kijkow C i B
  216. printf("\n%d.) Ruch",ruch);
  217. if(ruch%2 ==1)//move of dysk 1
  218. {
  219. if(C[ctop]==1)
  220. {
  221. btop++;
  222. B[btop]=C[ctop];
  223. C[ctop]=0;
  224. ctop--;
  225. B[0]++;
  226. C[0]--;
  227. printf("\ndysk %d: C->B",B[btop]);
  228. } //i jest na C
  229. else if(B[btop]==1)
  230. { //1 jest b
  231. ctop++;
  232. C[ctop]=B[btop];
  233. B[btop]=0;
  234. btop--;
  235. C[0]++;
  236. B[0]--;
  237. printf("\ndysk %d: B->C",C[ctop]);
  238. }
  239. }//ruch dysku 1
  240. else if(ruch %2 ==0)
  241. {
  242. if(btop !=0 && C[ctop]>B[btop])
  243. {//B[0]--;
  244. ctop++;
  245. C[ctop]=B[btop];
  246. B[btop]=0;
  247. btop--;
  248. B[0]--;
  249. C[0]++;
  250. printf("\ndysk %d: B->C",C[ctop]);
  251. }
  252. else if (btop ==0)
  253. {
  254. btop++;
  255. B[btop]=C[ctop];
  256. C[ctop]=0;
  257. ctop--;
  258. B[0]++;
  259. C[0]--;
  260. printf("\n dysk %d:C->B",B[btop]);
  261. }
  262. else if(ctop !=0 && B[btop]>C[ctop])
  263. {
  264. btop++;
  265. B[btop]=C[ctop];
  266. C[ctop]=0;
  267. ctop--;
  268. B[0]++;
  269. C[0]--;
  270. printf("\ndysk %d: C->B",B[btop]);
  271. }
  272. else if(ctop==0)
  273. {
  274. ctop++;
  275. C[ctop]=B[btop];
  276. B[btop]=0;
  277. btop--;
  278. B[0]--;
  279. C[0]++;
  280. printf("\ndysk %d: B->C",C[ctop]);
  281. }
  282. }//ruch innych dyskow
  283. break;
  284. default:
  285. printf("Blad!");
  286. }
  287. }
  288. while((ruch <=max) && (C[0]!=n) );
  289. printf("\n");
  290. stan(A,B,C,atop,btop,ctop);
  291. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement