AhmedAshraff

Untitled

Nov 25th, 2024
31
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.53 KB | None | 0 0
  1. #include <iostream>
  2. #include <ctime>
  3. #include <cmath>
  4. #include <cstdio>
  5. #include <algorithm>
  6. #include <map>
  7. #include <cstring>
  8. using namespace std;
  9.  
  10.  
  11. int mp[12][12];
  12. bool vis[12][12];
  13. bool chk(pair<int, int>a, pair<int, int>b, int msk){
  14.   int x = abs(a.first - b.first);
  15.   int y = abs(a.second - b.second);
  16.   if(x == 0){
  17.     if(a.second > b.second)swap(a, b);
  18.     a.second++;
  19.     while(a != b){
  20.       if(!(msk & (1 << mp[a.first][a.second])))return 0;
  21.       a.second++;
  22.     }
  23.     return 1;
  24.   }
  25.   if(y == 0){
  26.     if(a.first > b.first)swap(a, b);
  27.     a.first++;
  28.     while(a != b){
  29.       if(!(msk & (1 << mp[a.first][a.second])))return 0;
  30.       a.first++;
  31.     }
  32.     return 1;
  33.   }
  34.   if(x == y){
  35.     if(a.first < b.first)
  36.       a.first++;
  37.     else
  38.       a.first--;
  39.     if(a.second < b.second)
  40.       a.second++;
  41.     else
  42.       a.second--;
  43.  
  44.     while(a != b){
  45.       if(!(msk & (1 << mp[a.first][a.second])))return 0;
  46.  
  47.     if(a.first < b.first)
  48.       a.first++;
  49.     else
  50.       a.first--;
  51.     if(a.second < b.second)
  52.       a.second++;
  53.     else
  54.       a.second--;
  55.     }
  56.   }
  57.   return 1;
  58. }
  59.  
  60. long long dp[5][5][1<<13][100];
  61.  
  62.  
  63. int L, n;
  64.  
  65. long long solve(int rw, int col, int dist, int msk){
  66.     if(dist > L)return 0;
  67.     if(dist == L)return 1;
  68.  
  69.     long long &ret = dp[rw][col][msk][dist];
  70.  
  71.     if(~ret)return ret;
  72.  
  73.     ret = 0;
  74.  
  75.     for(int i = 0; i < 4; i++){
  76.       for(int j = 0; j < 3; j++){
  77.  
  78.         if(!vis[i][j] && !(msk&(1 << mp[i][j])) && chk({rw, col}, {i, j}, msk)){
  79.  
  80.             ret += solve(i, j,dist + abs(i - rw) + abs(j - col) ,msk | (1<<mp[i][j]));
  81.         }
  82.       }
  83.     }
  84.   return ret;
  85. }
  86.  
  87.  
  88. int msk = 0;
  89.  
  90.  
  91.  
  92. void init(){
  93.   mp[0][0] = 0;
  94.   mp[0][1] = 1;
  95.   mp[0][2] = 2;
  96.   mp[1][0] = 3;
  97.   mp[1][1] = 4;
  98.   mp[1][2] = 5;
  99.   mp[2][0] = 6;
  100.   mp[2][1] = 7;
  101.   mp[2][2] = 8;
  102.   mp[3][0] = 9;
  103.   mp[3][1] = 10;
  104.   mp[3][2] = 11;
  105. }
  106.  
  107. int main(){
  108.   //ios_base::sync_with_stdio(0);
  109.   //cin.tie(0);
  110.   init();
  111.  
  112.   memset(dp, -1, sizeof dp);
  113.  
  114.   cin >> L >> n;
  115.  
  116.   if(L > 60)
  117.     return puts("BAD MEMORY");
  118.  
  119.   for(int i = 0; i < n; i++){
  120.     int x, y;
  121.  
  122.     cin >> x >> y;
  123.     x--, y--;
  124.     swap(x, y);
  125.     vis[x][y] = true;
  126.   }
  127.  
  128.   long long ans = 0;
  129.  
  130.   for(int i = 0; i < 4; i++){
  131.     for(int j = 0; j < 3; j++){
  132.       if(!(msk&(1<<mp[i][j])) && !vis[i][j]){
  133.         ans += solve(i,j,0,msk|(1<<mp[i][j]));
  134.        // cout << i << ' ' << j << ' ' << ans << '\n';
  135.        // system("pause");
  136.       }
  137.     }
  138.   }
  139.  
  140.  
  141.   if(!ans)return puts("BAD MEMORY");
  142.  
  143.   cout << ans << '\n';
  144.  
  145. }
  146.  
Advertisement
Add Comment
Please, Sign In to add comment