Advertisement
Josif_tepe

Untitled

Nov 24th, 2024
38
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.79 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. #include <cmath>
  5. //#include <bits/stdc++.h>
  6. #include <map>
  7. using namespace std;
  8. int n, k;
  9. string v[20];
  10. unordered_map<string, bool> mapa;
  11.  
  12. bool check(vector<string> & v) {
  13.     int res = 0;
  14.     for(int i = 0; i < n; i++) {
  15.         string word = "";
  16.         for(int j = 0; j < n; j++) {
  17.             word += v[i][j];
  18.         }
  19.         if(mapa[word]) {
  20.             res++;
  21.         }
  22.         if(res >= 2 * n) {
  23.             return true;
  24.         }
  25.        
  26.         word = "";
  27.         for(int j = n - 1; j >= 0; j--) {
  28.             word += v[i][j];
  29.         }
  30.         if(mapa[word]) {
  31.             res++;
  32.         }
  33.         if(res >= 2 * n) {
  34.             return true;
  35.         }
  36.         word = "";
  37.         for(int j = 0; j < n; j++) {
  38.             word += v[j][i];
  39.         }
  40.         if(mapa[word]) {
  41.             res++;
  42.         }
  43.         if(res >= 2 * n) {
  44.             return true;
  45.         }
  46.        
  47.         word = "";
  48.         for(int j = n - 1; j >= 0; j--) {
  49.             word += v[j][i];
  50.         }
  51.         if(mapa[word]) {
  52.             res++;
  53.         }
  54.         if(res >= 2 * n) {
  55.             return true;
  56.         }
  57.     }
  58.     return false;
  59. }
  60. int main() {
  61.     ios_base::sync_with_stdio(false);
  62.     cin >> n >> k;
  63.    
  64.     unordered_map<string, bool> mapa;
  65.     map<vector<string>, bool> crossword_visited;
  66.     for(int i = 0; i < k; i++) {
  67.         cin >> v[i];
  68.         mapa[v[i]] = true;
  69.     }
  70.    
  71.     string tmp = "";
  72.     for(int i = 0; i < n; i++) {
  73.         tmp += ".";
  74.     }
  75.     vector<string> c(n, tmp);
  76.    
  77.     queue<vector<string>> q;
  78.     q.push(c);
  79.    
  80.     queue<vector<bool>> q_visited;
  81.     vector<bool> visited(k, false);
  82.     q_visited.push(visited);
  83.     int res = 0;
  84.     while(!q.empty()) {
  85.         c = q.front();
  86.         q.pop();
  87.        
  88.         visited = q_visited.front();
  89.         q_visited.pop();
  90.        
  91.         for(int i = 0; i < n; i++) {
  92.             for(int j= 0; j < n; j++) {
  93.                 cout << c[i][j];
  94.             }
  95.             cout << endl;
  96.         }
  97.         cout << endl;
  98.        
  99.        
  100.         if(check(c)) {
  101.             res++;
  102.             continue;
  103.         }
  104.         for(int a = 0; a < k; a++) {
  105.             if(!visited[a]) {
  106.                 for(int i = 0; i < n; i++) {
  107.                     bool ok = true;
  108.                     for(int j = 0; j < n; j++) {
  109.                         if(v[a][j] != c[i][j] and c[i][j] != '.') {
  110.                             ok = false;
  111.                             break;
  112.                         }
  113.                     }
  114.                     if(ok) {
  115.                         vector<string> t = c;
  116.                         for(int j = 0; j < n; j++) {
  117.                             t[i][j] = v[a][j];
  118.                         }
  119.                         if(!crossword_visited[t]) {
  120.                             q.push(t);
  121.                             visited[a] = true;
  122.                             q_visited.push(visited);
  123.                             visited[a] = false;
  124.                            
  125.                             crossword_visited[t] = true;
  126.                         }
  127.                     }
  128.                     ok = true;
  129.                     for(int j = n  - 1; j >= 0; j--) {
  130.                         if(v[a][j] != c[i][j] and c[i][j] != '.') {
  131.                             ok = false;
  132.                             break;
  133.                         }
  134.                     }
  135.                     if(ok) {
  136.                         vector<string> t = c;
  137.                         for(int j = n - 1; j >= 0; j--) {
  138.                             t[i][j] = v[a][j];
  139.                         }
  140.                         if(!crossword_visited[t]) {
  141.                             q.push(t);
  142.                             visited[a] = true;
  143.                             q_visited.push(visited);
  144.                             visited[a] = false;
  145.                             crossword_visited[t] = true;
  146.  
  147.                         }
  148.                     }
  149.                    
  150.                     ok = true;
  151.                     for(int j = 0; j < n; j++) {
  152.                         if(v[a][j] != c[j][i] and c[j][i] != '.') {
  153.                             ok = false;
  154.                             break;
  155.                         }
  156.                     }
  157.                     if(ok) {
  158.                         vector<string> t = c;
  159.                         for(int j = 0; j < n; j++) {
  160.                             t[j][i] = v[a][j];
  161.                         }
  162.                         if(!crossword_visited[t]) {
  163.                             q.push(t);
  164.                             visited[a] = true;
  165.                             q_visited.push(visited);
  166.                             visited[a] = false;
  167.                             crossword_visited[t] = true;
  168.  
  169.                         }
  170.                     }
  171.                     ok = true;
  172.                     for(int j = n - 1; j>= 0; j--) {
  173.                         if(v[a][j] != c[j][i] and c[j][i] != '.') {
  174.                             ok = false;
  175.                             break;
  176.                         }
  177.                     }
  178.                     if(ok) {
  179.                         vector<string> t = c;
  180.                         for(int j = n - 1; j >= 0; j--) {
  181.                             t[j][i] = v[a][j];
  182.                         }
  183.                         if(!crossword_visited[t]) {
  184.                             q.push(t);
  185.                             visited[a] = true;
  186.                             q_visited.push(visited);
  187.                             visited[a] = false;
  188.                             crossword_visited[t] = true;
  189.  
  190.                         }
  191.                     }
  192.                    
  193.                 }
  194.             }
  195.         }
  196.        
  197.        
  198.        
  199.     }
  200.     cout << res << endl;
  201.     return 0;
  202. }
  203.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement