vadimk772336

Untitled

Mar 14th, 2022
594
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.99 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <map>
  5. using namespace std;
  6.  
  7. struct my_pair
  8. {
  9.     int a;
  10.     int b;
  11. };
  12.  
  13. struct vertex
  14. {
  15.     bool isterminal = false;
  16.     // mapchar,int adj_list; // Заменить на массив длины 26
  17.     int adj_list[26] = { -1 };
  18.     bool is_exist[26] = { false };
  19.     // vector<int> adj_list(26,-1);
  20.     int list_size = 0;
  21.     int number_vertex;
  22. };
  23.  
  24. struct vertex_2
  25. {
  26.     int u;
  27.     int v;
  28.     bool isterminal = false;
  29.     bool isvisited = false;
  30.     struct my_pair adj_list[26];
  31.     bool is_exist[26] = { false };
  32.     int number_in_array;
  33. };
  34.  
  35. struct adj_vertex
  36. {
  37.     int number_vertex;
  38.     char symbol;
  39. };
  40.  
  41. void addEdge(int i, int j, char symbol, struct vertex* DFA)
  42. {
  43.     int symbol_idx = int(symbol) - 97;
  44.     DFA[i].adj_list[symbol_idx] = j;
  45.     DFA[i].is_exist[symbol_idx] = true;
  46.     DFA[i].list_size++;
  47. }
  48.  
  49. void Fill_DFA(int n, int k, int l, vector<char>& alphabet, struct vertex* DFA)
  50. {
  51.     int u, v, c_idx;
  52.     char c;
  53.     int terminals[k];
  54.  
  55.     int indicators[26] = { 0 };
  56.  
  57.     for (int i = 0; i < k; ++i)
  58.         cin >> terminals[i];
  59.  
  60.     for (int i = 0; i < k; ++i)
  61.     {
  62.         DFA[terminals[i]].isterminal = true;
  63.     }
  64.  
  65.  
  66.     for (int i = 0; i < n * l; ++i)
  67.     {
  68.         cin >> u >> c >> v;
  69.         // DFA.addEdge(u,v,c, DFA);
  70.         addEdge(u, v, c, DFA);
  71.  
  72.         //Запоминаю алфавит автоматов
  73.         c_idx = int(c) - 97;
  74.         if (indicators[c_idx] == 0)
  75.         {
  76.             alphabet.push_back(c);
  77.             indicators[c_idx] = 1;
  78.         }
  79.         else
  80.             indicators[c_idx] = 1;
  81.     }
  82.  
  83.     return;
  84. }
  85.  
  86.  
  87. void display(struct vertex* DFA, int n)
  88. {
  89.     cout << "\n print:" << endl;
  90.     for (int i = 0; i < n; i++)
  91.     {
  92.         cout << "vertex: " << i << " ";
  93.         if (DFA[i].isterminal)
  94.             cout << "isterminal"
  95.                  << " ";
  96.  
  97.         cout << "adj_vertexes: ";
  98.         for (int j = 0; j < 26; ++j)
  99.         {
  100.             if (DFA[i].is_exist[j] == true)
  101.                 std::cout << "(" << char(j + 97) << "," << DFA[i].adj_list[j] << "); ";
  102.         }
  103.         cout << endl;
  104.     }
  105. }
  106.  
  107. void display(struct vertex_2* DFA, int n)
  108. {
  109.     cout << "\n print:" << endl;
  110.     for (int i = 0; i < n; i++)
  111.     {
  112.         cout << "vertex: " << i << " ";
  113.         if (DFA[i].isterminal)
  114.             cout << "isterminal" << " ";
  115.  
  116.         cout << "adj_vertexes: ";
  117.         for (int j = 0; j < 26; ++j)
  118.         {
  119.             if (DFA[i].is_exist[j] == true)
  120.                 std::cout << "(" << char(j + 97) << ", (" << DFA[i].adj_list[j].a << ", )" << DFA[i].adj_list[j].b; "); ";
  121.         }
  122.         cout << endl;
  123.     }
  124. }
  125.  
  126. void clean_DFA(struct vertex* DFA, int n)
  127. {
  128.     for (int i = 0; i < n; i++)
  129.     {
  130.         DFA[i].isterminal = false;
  131.         DFA[i].list_size = 0;
  132.  
  133.         for (int j = 0; j < 26; ++j)
  134.         {
  135.             // DFA[i].adj_list[j] = -1;   //Эта строчка ломает код
  136.             DFA[i].is_exist[j] = false;
  137.         }
  138.     }
  139. }
  140.  
  141. int main()
  142. {
  143.     // n — колво состояний.  k — колво терминальных состояний.  l — колво букв в алфавите.
  144.     int n1, k1, l1;
  145.     int n2, k2, l2;
  146.     int v1,v2;
  147.     int number_in_array;
  148.    
  149.     vector<char> alphabet1;
  150.     cin >> n1 >> k1 >> l1;
  151.     vertex DFA1[n1];
  152.     clean_DFA(&DFA1[n1], n1);
  153.     Fill_DFA(n1, k1, l1, alphabet1, &DFA1[n1]);
  154.  
  155.  
  156.     vector<char> alphabet2;
  157.     cin >> n2 >> k2 >> l2;
  158.     vertex DFA2[n2];
  159.     clean_DFA(&DFA2[n2], n2);
  160.     Fill_DFA(n2, k2, l2, alphabet2, &DFA2[n2]);
  161.  
  162.     display(&DFA1[n1], n1);
  163.     display(&DFA2[n2], n2);
  164.    
  165.     cout << " start1" << endl;
  166.     int N = n1*n2;
  167.     struct vertex_2 dec_graph[N];
  168.     vertex_2 buff;
  169.     struct my_pair dec_ver;
  170.     cout << " start2" << endl;
  171.     /*
  172.     for (int i =0; i < n1; ++i)
  173.     {
  174.         for (int j =0; j < n2; ++j)
  175.         {
  176.             buff.u = i;
  177.             buff.v = j;
  178.             buff.isterminal = (DFA1[i].isterminal != DFA2[j].isterminal);
  179.             buff.number_in_array = i*n2+j;
  180.            
  181.             for (int k = 0; k < 26; ++k)
  182.             {
  183.                 if (DFA1[i].is_exist[k] && DFA2[j].is_exist[k])
  184.                 {
  185.                     dec_ver.a = DFA1[i].adj_list[k]; //Куда переходит авт1 по символу c
  186.                     dec_ver.b = DFA2[j].adj_list[k]; //Куда переходит авт2 по символу c
  187.                     buff.adj_list[k] = dec_ver; //по этой штуке понятно к кому обращаться при обходе
  188.                     buff.is_exist[k] = true;
  189.                 }
  190.                 else
  191.                 {
  192.                     dec_graph[i*n2+j].is_exist[k] = false;
  193.                 }
  194.             }
  195.            
  196.             dec_graph[i*n2+j] = buff;
  197.         }
  198.     }
  199.  
  200.     cout << " display:" << endl;
  201.     //display(&dec_graph[n1*n2], n1*n2);
  202.     */
  203.     return 0;
  204. }
  205.  
Advertisement
Add Comment
Please, Sign In to add comment