Advertisement
Guest User

Untitled

a guest
Dec 5th, 2016
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.17 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <string.h>
  4. using namespace std;
  5.  
  6. #define MAX_CARTONASE 1000
  7. #define MAX_SIR 15
  8.  
  9. int cnt,bst,cf;
  10.  
  11. typedef struct{
  12. char galben;
  13. union{
  14. char verde;
  15. char portocaliu[3];
  16. };
  17. }cartonas;
  18.  
  19. struct mutare{
  20. cartonas nod;
  21. struct mutare *urmator;
  22. };
  23.  
  24. typedef mutare* lista;
  25. int curentBst[10005], bkt[10005];
  26.  
  27. lista mutariJoc(cartonas vecCartonase[MAX_CARTONASE], char literaStart, char sirFinal[MAX_SIR]);
  28. void generareSir(cartonas v[], char curent[], char s[], int step, int n, int m);
  29.  
  30. int main()
  31. {
  32. cartonas v[MAX_CARTONASE];
  33. char s[MAX_SIR], temp;
  34. int n,i,m;
  35. cout<<"Introduceti numarul de cartonase ale fetei"<<'\n';
  36. cin>>n;
  37. cf = n;
  38. cout<<"Introduceti cartonasele fetei sub forma A BC"<<'\n';
  39. for(i = 1;i <= n;i++, cnt++){
  40. cin>>v[cnt].galben>>v[cnt].portocaliu;
  41. }
  42. cout<<"Introduceti numarul de cartonase ale baiatului"<<'\n';
  43. cin>>m;
  44. cout<<"Introduceti cartonasele baiatului sub forma E 0"<<'\n';
  45. for(i = 1;i <= m;i++, cnt++){
  46. cin>>v[cnt].galben>>v[cnt].verde;
  47. }
  48. cout<<"Introduceti sirul T sub forma 2403"<<'\n';
  49. cin>>s;
  50. cout<<"Introduceti caracterul de inceput sub forma A"<<'\n';
  51. cin>>temp;
  52. bst = 10000000;
  53. lista rezultat = mutariJoc(v, temp, s);
  54. if(rezultat == NULL){
  55. cout<<"Nu se poate obtine sirul T";
  56. }else{
  57. for(int i = 1;rezultat != NULL;rezultat = rezultat->urmator, i++){
  58. cout<<"Am folosit mutarea "<<rezultat->nod.galben<<' ';
  59. if(curentBst[i] >= cf){
  60. cout<<rezultat->nod.verde;
  61. }else{
  62. cout<<rezultat->nod.portocaliu;
  63. }
  64. cout<<'\n';
  65. }
  66. }
  67. return 0;
  68. }
  69.  
  70. lista mutariJoc(cartonas vecCartonase[MAX_CARTONASE], char literaStart, char sirFinal[MAX_SIR]){
  71. char curent[MAX_SIR + 5];
  72. curent[0] = literaStart;
  73. generareSir(vecCartonase, curent, sirFinal, 1, 1, strlen(sirFinal));
  74. if(bst == 10000000){
  75. return NULL;
  76. }
  77. lista ret = new mutare;
  78. ret->nod = vecCartonase[curentBst[1]];
  79. ret->urmator = NULL;
  80. lista p = ret;
  81. for(int i = 2;i <= bst;i++,p = p->urmator){
  82. lista ax = new mutare;
  83. ax->nod = vecCartonase[curentBst[i]];
  84. ax->urmator = NULL;
  85. p->urmator = ax;
  86. }
  87. return ret;
  88. }
  89.  
  90. bool corect(char curent[], char s[], int n, int m){
  91. if(n != m){
  92. return 0;
  93. }
  94. for(int i = 0;i < n;i++){
  95. if(curent[i] != s[i]){
  96. return 0;
  97. }
  98. }
  99. return 1;
  100. }
  101.  
  102. bool checkPrefix(char curent[], char s[], int n, int m){
  103. for(int i = 0;curent[i] >= '0' && curent[i] <= '9';i++){
  104. if(curent[i] != s[i]){
  105. return 0;
  106. }
  107. }
  108. return 1;
  109. }
  110.  
  111. void generareSir(cartonas v[], char curent[], char s[], int step, int n, int m){
  112. int i,j;
  113. for(i = 0;i < n;i++){
  114. for(j = 0;j < cnt;j++){
  115. if(curent[i] == v[j].galben){
  116. bkt[step] = j;
  117. if(j >= cf){
  118. char lit = curent[i];
  119. curent[i] = v[j].verde;
  120. if(checkPrefix(curent, s, n, m) == 0){
  121. curent[i] = lit;
  122. continue;
  123. }
  124. if(corect(curent, s, n, m) == 1 && step < bst){
  125. bst = step;
  126. for(int k = 1;k <= step;k++){
  127. curentBst[k] = bkt[k];
  128. }
  129. }else{
  130. generareSir(v, curent, s, step + 1, n, m);
  131. curent[i] = lit;
  132. }
  133. }else{
  134. char lit = curent[i];
  135. int length = strlen(v[j].portocaliu);
  136. if(n + length - 1 > 15){
  137. continue;
  138. }
  139. int l,k;
  140. for(l = 1, k = i + length;l <= n - i - 1;l++, k++){
  141. curent[k] = curent[k - length + 1];
  142. }
  143. for(l = 0;l < length;l++){
  144. curent[i+l] = v[j].portocaliu[l];
  145. }
  146. if(checkPrefix(curent, s, n, m) == 0){
  147. curent[i] = lit;
  148. for(l = 1, k = i + 1;l <= n - i - 1;l++, k++){
  149. curent[k] = curent[k + length + 1];
  150. }
  151. continue;
  152. }
  153. if(corect(curent, s, n, m) == 1 && step < bst){
  154. bst = step;
  155. for(k = 1;k <= step;k++){
  156. curentBst[k] = bkt[k];
  157. }
  158. }else{
  159. generareSir(v, curent, s, step + 1, n + length - 1, m);
  160. curent[i] = lit;
  161. for(l = 1, k = i + 1;l <= n - i - 1;l++, k++){
  162. curent[k] = curent[k + length + 1];
  163. }
  164. }
  165. }
  166. }
  167. }
  168. }
  169. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement