ismaeil

Helpful Currents

Sep 2nd, 2021 (edited)
1,092
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.38 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. using ll = long long;
  5.  
  6. const ll MOD = 1000003;
  7. const ll M = 55555;
  8. const ll N = 333;
  9.  
  10. char grid[N][M];
  11. int n ,m ,c;
  12. ll dp[N][M];
  13.  
  14. inline bool isValid(int i ,int j)
  15. {
  16.     return (0 <= i && i < n && 0 <= j && j < m && grid[i][j] != '#');
  17. }
  18.  
  19. bool DFS(int i ,int j)
  20. {
  21.     /// --- Check if there is path --- ///
  22.     if( !isValid(i ,j) ) return false;
  23.     if( grid[i][j] == '@' ) return true;
  24.  
  25.     dp[i][j] = true;
  26.  
  27.     bool re = false;
  28.  
  29.     if( !dp[i - 1][j] ){
  30.         re |= DFS(i - 1 ,j);
  31.     }
  32.  
  33.     if( grid[i][j] == '<' ){
  34.         if( !dp[i][j - 1] ){
  35.             re |= DFS(i ,j - 1);
  36.         }
  37.     }
  38.  
  39.     if( grid[i][j] == '>' ){
  40.         if( !dp[i][j + 1] ){
  41.             re |= DFS(i ,j + 1);
  42.         }
  43.     }
  44.  
  45.     return re;
  46. }
  47.  
  48. ll calc(int i ,int j)
  49. {
  50.     if( !isValid(i ,j) )    return 0ll;
  51.     if( grid[i][j] == '@' ) return 1ll;
  52.  
  53.     ll &re = dp[i][j];
  54.     if( re + 1 ) return re;
  55.  
  56.     re = calc(i - 1 ,j);
  57.     re %= MOD;
  58.  
  59.     if( grid[i][j] == '<' ){
  60.         re += calc(i ,j - 1);
  61.         re %= MOD;
  62.     }
  63.  
  64.     if( grid[i][j] == '>' ){
  65.         re += calc(i ,j + 1);
  66.         re %= MOD;
  67.     }
  68.  
  69.     return re;
  70. }
  71.  
  72. int main()
  73. {
  74.     scanf("%d%d%d" ,&n ,&m ,&c);
  75.     for(int i = 0 ; i < n ; i++){
  76.         for(int j = 0 ; j < m ; j++){
  77.             scanf("\n%c" ,&grid[i][j]);
  78.         }
  79.     }
  80.  
  81.     memset(dp ,0 ,sizeof dp);
  82.     if( DFS(n - 1 ,c) ){
  83.         memset(dp ,-1 ,sizeof dp);
  84.         printf("%lld" ,calc(n - 1 ,c));
  85.     } else {
  86.         puts("begin repairs");
  87.     }
  88.  
  89.     return 0;
  90. }
Add Comment
Please, Sign In to add comment