Advertisement
FyanRu

labyrinth

Nov 22nd, 2022
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.04 KB | Source Code | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4.  
  5. struct ph {
  6.     inline size_t operator()(const pair<int,int> & v) const {
  7.         return v.first*53+v.second;
  8.     }
  9. };
  10.  
  11. int main() {
  12.     ios::sync_with_stdio(false);
  13.     cin.tie(nullptr);
  14.     int n; cin >> n;
  15.     bool bad[n+2][n+2];
  16.    
  17.     for (int i = 0; i < n+2; i++) {
  18.         bad[0][i] = true;
  19.         bad[n+1][i] = true;
  20.         bad[i][0] = true;
  21.         bad[i][n+1] = true;
  22.     }
  23.    
  24.     for (int i = 0; i < n; i++) {
  25.         for (int j = 0; j < n; j++) {
  26.             cin >> bad[i+1][j+1];
  27.         }
  28.     }
  29.    
  30.     ll dp[n+2][n+2];
  31.     for (int i = 0; i < n+2; i++) {
  32.         for (int j = 0; j < n+2; j++) {
  33.             dp[i][j] = 0;
  34.         }
  35.     }
  36.    
  37.     vector<pair<int,int>> order;
  38.     unordered_set<pair<int,int>, ph> vis;
  39.     queue<pair<int,int>> bfs;
  40.     bfs.push(make_pair(0,0));
  41.     dp[1][1]=1;
  42.    
  43.    
  44.     while (!bfs.empty()) {
  45.         pair<int,int> t = bfs.front();
  46.         bfs.pop();
  47.         if (vis.find(t) != vis.end()) {
  48.             continue;
  49.         }
  50.         if (bad[t.first+1][t.second+1]) {
  51.             continue;
  52.         }
  53.        
  54.         vis.insert(t);
  55.         order.push_back(t);
  56.        
  57.         bfs.push(make_pair(t.first+1,t.second));
  58.         bfs.push(make_pair(t.first-1,t.second));
  59.         bfs.push(make_pair(t.first,t.second+1));
  60.         bfs.push(make_pair(t.first,t.second-1));
  61.        
  62.         if (t.first==n-1 && t.second==n-1) {
  63.             break;
  64.         }
  65.     }
  66.    
  67.     for (int i = 0; i < order.size(); i++) {
  68.         pair<int, int> t = order[i];
  69.         dp[t.first][t.second+1] += dp[t.first+1][t.second+1];
  70.         dp[t.first+2][t.second+1] += dp[t.first+1][t.second+1];
  71.         dp[t.first+1][t.second] += dp[t.first+1][t.second+1];
  72.         dp[t.first+1][t.second+2] += dp[t.first+1][t.second+1];
  73.     }
  74.    
  75.     for (int i = 1; i < n+1; i++) {
  76.         for (int j = 1; j < n+1; j++) {
  77.             cout << dp[i][j] << " ";
  78.         }
  79.         cout << "\n";
  80.     }
  81.    
  82.     return 0;
  83. }
  84.  
Tags: C++
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement