Korotkodul

bfs. конь

Dec 6th, 2021 (edited)
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.78 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <set>
  5. #include <string>
  6. #include <algorithm>
  7. #include <queue>
  8. using namespace std;
  9. using ll = long long;
  10. #define pii pair <int, int>
  11. void cv(vector <int> v){
  12.     for (auto x: v) cout<<x<<' ';
  13.     cout<<'\n';
  14. }
  15. int N;
  16. bool in(int x, int y){
  17.     bool a = x < N && x >=0;
  18.     bool b = y < N && y >= 0;
  19.     return a&&b;
  20. }
  21.  
  22. vector <int> dx = {-2, -2, -1, 1, 2, 2, 1, -1};
  23. vector <int> dy = {-1, 1, 2, 2, 1, -1, -2, -2};
  24. vector <vector <vector <pii> > > dsk(8, vector <vector <pii> > (8));
  25. queue <pii> go1;
  26. pii strt, fin;
  27. vector < vector <pii> > pred;
  28. vector <vector<int>> dst(8, vector <int> (8, -1));
  29. int cnt = 0;
  30. void bfs(){
  31.     dst[strt.first][strt.second] = 0;
  32.     go1.push(strt);
  33.     cout<<"BFS\n";
  34.     while (!go1.empty()){
  35.         auto v = go1.front();
  36.         //cout<<"v= \n";
  37.     //cout<<v.first<<' '<<v.second<<'\n';
  38.         for (auto u: dsk[v.first][v.second]){
  39.             if (dst[u.first][u.second] = -1){
  40.                 dst[u.first][u.second] = dst[v.first][v.second] + 1;
  41.                 go1.push(u);
  42.                 pred[u.first][u.second] = v;
  43.             }
  44.             if (u == fin){
  45.                 return;
  46.             }
  47.         }
  48.         go1.pop();
  49.         cnt++;
  50.         //if (cnt == 200) exit(0);
  51.     }
  52. }
  53.  
  54. int main()
  55. {
  56.     /*ios::sync_with_stdio(0);
  57.     cin.tie(0);
  58.     cout.tie(0);*/
  59.     cin>>N;
  60.     dsk.resize(N);
  61.     dst.resize(N);
  62.     for (int i=0;i<N;++i){
  63.         dsk[i].resize(N);
  64.         dst[i].resize(N, -1);
  65.     }
  66.     for (int i = 0; i < N;++i){
  67.         for (int j=0;j<N;++j){
  68.                 //cout<<"IJ= "<<i<<" "<<j<<"\n";
  69.             for (int ngb = 0; ngb<8; ++ngb){
  70.                 //cout<<"ngb= "<<ngb<<'\n';
  71.                 int I = i + dx[ngb];
  72.                 int J = j + dy[ngb];
  73.                 //cout<<"dx dy = "<<dx[ngb]<<' '<<dy[ngb]<<'\n';
  74.                 if (in(I, J)){
  75.                     dsk[i][j].push_back({I, J});
  76.                 }
  77.             }//cout<<'\n';
  78.         }
  79.     }
  80.     /*cout<<"\nDESK\n";
  81.     for (int i = 0; i < N;++i){
  82.         for (int j=0;j<N;++j){
  83.                 cout<<"IJ= "<<i<<" "<<j<<"\n";
  84.             for (auto ngb: dsk[i][j]){
  85.                 cout<<ngb.first<<' '<<ngb.second<<"\n";
  86.             }cout<<"\n";
  87.         }
  88.     }*/
  89.  
  90.     cin>>strt.first>>strt.second>>fin.first>>fin.second;
  91.     strt.first--;
  92.     strt.second--;
  93.     fin.first--;
  94.     fin.second--;
  95.     bfs();
  96.     cout<<"ans= \n";
  97.     cout<<dst[fin.first][fin.second]<<'\n';
  98.     cout<<"predki\n";
  99.     pii pr = fin;
  100.     vector <pii> ans_pred;
  101.     while (true){
  102.         ans_pred.push_back(pr);
  103.         pr = pred[pr.first][pr.second];
  104.         if (pr == strt) break;
  105.     }
  106.     for (auto x: ans_pred) cout<<x.first<<' '<<x.second<<'\n';
  107.     cout<<'\n';
  108. }
  109.  
Add Comment
Please, Sign In to add comment