Advertisement
dmkozyrev

search_dnf

Jun 3rd, 2015
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.09 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cmath>
  4.  
  5. using namespace std;
  6.  
  7. vector <int> read_function(int& N);
  8. vector <vector<int>> build_tab(vector<int>& f, int N);
  9. int count_ones(vector<int>& v);
  10. void sort_tab(vector<vector<int>>& tab);
  11. void print_tab(vector<vector<int>>& tab, int N, int flag);
  12. int compare(vector<int>& a, vector<int>& b);
  13. bool compare_tab(vector<vector<int>>& tab);
  14. vector<vector<bool>> build_matrix(vector<vector<int>>& Nf, vector<vector<int>>& tab);
  15. void print_matrix(vector<vector<bool>>& matrix);
  16. vector<vector<int>> search_dnf (vector<vector<bool>>& matrix, int N);
  17.  
  18. int main (){
  19.     int N = 4;
  20.     //auto f = read_function(N);
  21.     //vector<int> f = {1,0,1,0,0,1,1,0,1,1,0,1,0,0,1,1};
  22.     //vector<int> f = {0,1,0,0,0,1,0,0,1,0,1,0,0,0,1,1};
  23. //  vector<int> f = {0,1,0,1,1,0,0,1,0,0,1,0,1,1,0,0};
  24.     vector<int> f = {1,0,1,1,1,0,1,1,0,1,0,1,1,1,0,0};
  25.     auto tab = build_tab(f, N);
  26.     sort_tab(tab);
  27.     auto save = tab;
  28.     while ( compare_tab(tab) );
  29.     print_tab(save, N, 0);
  30.     print_tab(tab, N, 1);
  31.     auto matrix = build_matrix(save, tab);
  32.     print_matrix(matrix);
  33.    
  34.     auto answer = search_dnf(matrix, N);
  35.     cout << endl << "DNF [" << answer.size() << "] >> " << endl;
  36.     for (int i = 0; i < answer.size(); ++i){
  37.         cout << "I" <<answer[i][0]+1;
  38.         for (int j = 1; j < answer[i].size(); ++j)
  39.             cout << " + I" << answer[i][j]+1;
  40.         cout << endl;
  41.     }      
  42. }
  43.  
  44. vector<vector<int>> search_dnf (vector<vector<bool>>& matrix, int N){
  45.     vector<vector<int>> answer;
  46.     int limit = pow(2, matrix.size());
  47.     for (int i = 0; i < limit; ++i){
  48.         int num = i, count = 0;
  49.         vector <int> temp;
  50.         vector <bool> checked;
  51.         for (int j = 0; j < matrix[0].size(); ++j) checked.push_back(false);
  52.        
  53.         for (int j = 0; j < matrix.size(); ++j){
  54.             temp.push_back(num % 2);
  55.             if ( temp[j] != 0 )
  56.                 for (int k = 0; k < matrix[j].size(); ++k){
  57.                     if ( matrix[j][k] && !checked[k] ){
  58.                         checked[k] = true;
  59.                         ++ count;
  60.                     }
  61.                 }
  62.             num /= 2;  
  63.         }
  64.         if ( count == checked.size() ){
  65.             vector <int> temp2;
  66.             for (int j = 0; j < matrix.size(); ++j)
  67.                 if ( temp[j] != 0 )
  68.                     temp2.push_back(j);
  69.             answer.push_back(temp2);           
  70.         }
  71.     }
  72.     vector <int> del;
  73.     for (int i = 0; i < answer.size()-1; ++i)
  74.         for (int j = i+1; j < answer.size(); ++j){
  75.             int count = 0;
  76.             for (int k = 0; k < answer[i].size(); k++){
  77.                 for (int t = 0; t < answer[j].size(); t++){
  78.                     if ( answer[i][k] == answer[j][t] )
  79.                         ++count;
  80.                 }
  81.             }
  82.            
  83.             if ( count == answer[i].size() ) {
  84.                 bool flag = true;
  85.                 for (int k = 0; k < del.size(); k++){
  86.                     if ( del[k] == j ) flag = false;
  87.                 }
  88.                 if ( flag )
  89.                     del.push_back(j);
  90.             }
  91.         }
  92.     vector<int> checked;
  93.     for (int i = 0; i < answer.size(); ++i)
  94.         checked.push_back(true);
  95.    
  96.     for (int i = 0; i < del.size(); ++i)
  97.         checked[del[i]] = false;       
  98.    
  99.     vector<vector<int>> answer2;
  100.     for (int i = 0; i < answer.size(); i++)
  101.         if ( checked[i] ) answer2.push_back(answer[i]);
  102.        
  103.     return answer2;
  104. }
  105.  
  106. vector<vector<bool>> build_matrix(vector<vector<int>>& Nf, vector<vector<int>>& tab){
  107.     vector<vector<bool>> matrix;
  108.     for (int i = 0; i < tab.size(); ++i){
  109.         vector<bool> temp;
  110.         for (int j = 0; j < Nf.size(); ++j){
  111.             bool flag = true;
  112.             for (int k=0; k < tab[i].size(); ++k){
  113.                 if ( tab[i][k] != 2 )
  114.                     if ( tab[i][k] != Nf[j][k] ) {
  115.                         flag = false;
  116.                         break;
  117.                     }          
  118.             }
  119.             temp.push_back(flag);
  120.         }
  121.         matrix.push_back(temp);
  122.     }
  123.     return matrix;
  124. }
  125.  
  126. void print_matrix(vector<vector<bool>>& matrix){
  127.     cout << "Matrix >>" << endl;
  128.     for (int i = 0; i < matrix.size(); ++i){
  129.         cout << "   ";
  130.         for (int j = 0; j < matrix[i].size(); ++j)
  131.             if ( matrix[i][j] ) cout << "1 "; else cout << "0 ";
  132.         cout << endl;
  133.     }
  134. }
  135.  
  136. void print_tab(vector<vector<int>>& tab, int N, int flag){
  137.     string str;
  138.     if ( flag == 0) str = "Carrier"; else str = "Intervals";
  139.     cout << str <<" >> " << endl;
  140.     if ( flag == 0) str = "   P"; else str = "   I";
  141.     for (int i = 0; i < tab.size(); ++i) {
  142.         cout << str << i+1 << " >> ";
  143.         for (int j = N-1; j >= 0; --j){
  144.             if ( tab[i][j] == 2 )
  145.                 cout << "* ";
  146.             else
  147.                 cout << tab[i][j] << " ";
  148.         }
  149.         cout << endl;
  150.     }  
  151. }
  152.  
  153. int compare(vector<int>& a, vector<int>& b){
  154.     int count = 0, k;
  155.     for (int i = 0; i < a.size(); ++i)
  156.         if ( a[i] != b[i] ) {
  157.             k = i;
  158.             ++count;
  159.         }
  160.     if ( count == 0 ){
  161.         return -2;
  162.     } else if ( count == 1){
  163.         return k;
  164.     } else return -1;
  165. }
  166.  
  167. bool compare_tab(vector<vector<int>>& tab){
  168.     bool compared = false;
  169.     vector<vector<int>> answer;
  170.     vector<bool> checked;
  171.    
  172.     for (int i = 0; i < tab.size(); ++i)
  173.         checked.push_back(false);
  174.        
  175.     for (int i = 0; i < tab.size()-1; ++i)
  176.         for (int j = i+1; j < tab.size(); ++j){
  177.             int k = compare(tab[i],tab[j]);
  178.             if ( k != -1 ) {
  179.                 compared = true;
  180.                 checked [i] = true;
  181.                 checked [j] = true;
  182.                 vector<int> temp = tab[i];
  183.                 temp[k] = 2;
  184.                 bool flag = true;
  185.                 for (auto &t : answer)
  186.                     if ( compare(t, temp) == -2 ){
  187.                         flag = false;
  188.                         break;
  189.                     }
  190.                 if ( flag )
  191.                     answer.push_back(temp);
  192.             }
  193.         }
  194.     for (int i = 0; i < tab.size(); ++i){
  195.         if ( !checked[i] )
  196.             answer.push_back(tab[i]);
  197.     }
  198.     tab = answer;
  199.     return compared;               
  200. }
  201.  
  202. void sort_tab(vector<vector<int>>& tab) {
  203.     for (int i = 0; i < tab.size()-1; ++i)
  204.         for (int j = i+1; j < tab.size(); ++j)
  205.             if ( count_ones(tab[i]) > count_ones(tab[j])){
  206.                 auto temp = tab[i];
  207.                 tab[i] = tab[j];
  208.                 tab[j] = temp;
  209.             }      
  210. }
  211.  
  212. vector <vector<int>> build_tab(vector<int>& f, int N){
  213.     vector<vector<int>> tab;
  214.     for (int i = 0; i < f.size(); ++i)
  215.         if ( f[i] ){
  216.             int num = i;
  217.             vector<int> temp;
  218.             for (int j = 0; j < N; ++j){
  219.                 temp.push_back(num % 2);
  220.                 num /= 2;  
  221.             }
  222.             tab.push_back(temp);
  223.         }
  224.     return tab;
  225. }
  226.  
  227. vector <int> read_function(int& N){
  228.     cout << "Enter the number of variables and values of the function: " << endl << "//Example: 3 1 0 1 0 1 0 1 0" << endl;
  229.     cin >> N;
  230.     int x, limit = pow(2, N);
  231.     vector <int> f;
  232.     for (int i = 0; i < limit; ++i){
  233.         cin >> x;
  234.         f.push_back(x);
  235.     }
  236.     return f;  
  237. }
  238.  
  239. int count_ones(vector<int>& v){
  240.     int count = 0;
  241.     for (auto &i : v)
  242.         if ( i == 1 )
  243.             ++count;
  244.     return count;
  245. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement