Advertisement
lucacodorean

bile

Jan 29th, 2020
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.92 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <queue>
  4. #define MAX 21
  5. using namespace std;
  6.  
  7. ifstream fin("bile.in");
  8. ofstream fout("bile.out");
  9. int di[4]= {-1,0,1,0};
  10. int dj[4]= {0,1,0,-1};
  11. int a[MAX][MAX],n,m,drumuri=0,nexti,nextj,l=0;
  12. pair<int,int>d[MAX*MAX];
  13. queue<pair<int, int> > q;
  14.  
  15. bool posibil(int i, int j);
  16. void backtr(int i, int j, int pas);
  17.  
  18. int main()
  19. {
  20.     int starti, startj;
  21.     fin>>n>>m;
  22.     for(int i=1; i<=n; i++)
  23.     {
  24.         for(int j=1; j<=m; j++)
  25.         {
  26.             fin>>a[i][j];
  27.         }
  28.     }
  29.     fin>>starti>>startj;
  30.  
  31.     for(int j=1; j<=m; j++)
  32.     {
  33.         q.push({1,j});
  34.     }
  35.  
  36.     for(int i=1; i<=n; i++)
  37.     {
  38.         q.push({i,1});
  39.     }
  40.  
  41.     for(int i=n; i>=1; i--)
  42.     {
  43.         q.push({i,n});
  44.     }
  45.  
  46.     for(int j=m; j>=1; j--)
  47.     {
  48.         q.push({j,m});
  49.     }
  50.  
  51.     backtr(starti,startj,1);
  52.  
  53.     for(int i=1; i<=n; i++)
  54.     {
  55.         for(int j=1; j<=m; j++)
  56.         {
  57.             fout<<a[i][j]<<" ";
  58.         }
  59.         fout<<endl;
  60.     }
  61.  
  62.     cout<<drumuri;
  63.     fin.close();
  64.     fout.close();
  65.     return 0;
  66. }
  67.  
  68. bool posibil(int i, int j)
  69. {
  70.     return i>0 && i<=n && j>0 && j<=m;
  71. }
  72.  
  73. void backtr(int i, int j, int pas)
  74. {
  75.     a[i][j]=pas;
  76.     d[pas]= {i,j};
  77.     while(!q.empty())
  78.     {
  79.         int stopi=q.front().first;
  80.         int stopj=q.front().second;
  81.         if(i==stopi && j==stopj)
  82.         {
  83.             drumuri+=1;
  84.             for(int k=0; k<=pas; k++)
  85.             {
  86.                 cout<<d[k].first<<" "<<d[k].second<<endl;
  87.             }
  88.         }
  89.         else
  90.         {
  91.             for(int k=0; k<4; k++)
  92.             {
  93.                 int nexti=i+di[k];
  94.                 int nextj=j+dj[k];
  95.                 if(posibil(nexti,nextj) && a[nexti][nextj]<a[i][j])
  96.                 {
  97.                     backtr(nexti, nextj, pas+1);
  98.                 }
  99.             }
  100.         }
  101.         q.pop();
  102.     }
  103.     a[i][j]=pas;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement