iamyeasin

justLearnedBacktrack

Apr 8th, 2018
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.31 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define     sf      scanf
  3. #define     pf      printf
  4. #define     inf     INT_MAX
  5. #define     dbg     cout << "Debug" << endl;
  6. #define     MAX     1024
  7. #define     block   -1
  8. #define     white   +0
  9. #define     noway   -3
  10. #define     source  -4
  11. #define     goal    -5
  12.  
  13. using namespace std;
  14.  
  15. void clr();
  16. void printGrid();
  17. void printGrid2();
  18. void printGrid3();
  19.  
  20. vector < int > adjList[1024];
  21. char ans[28][28];
  22.  
  23. int dx[] = { +0, -1, +0, +1 };
  24. int dy[] = { -1, +0, +1, +0 };
  25.  
  26.  
  27. int nodes,start,edges,n,a,b,c=0,l,w,sx,sy,gx,gy,flag = false,off = false;
  28. int visited[1025] ,d[1024],par[1024];
  29. int cost[1024][1024];
  30. int grid[ MAX ][ MAX ];
  31.  
  32. bool isOk( int x, int y ){
  33.     return ( x >= 1 && (x <= (l << 2)+1) && y >= 1 && (y<=(w<<1)+1) );
  34. }
  35.  
  36. bool isValid( int cd, int pd ){
  37.     if( (cd == 2 && pd == 0) || ( pd == 2 && cd == 0 ) || ( cd == 3 && pd == 1) ||
  38.         (cd == 1 && pd == 3) ) return false;
  39.     else return true;
  40. }
  41.  
  42. bool isNoMove( int x, int y , int pd ){
  43.     for( int i=0; i<4; i++ ){
  44.         int mx = dx[i] + x;
  45.         int my = dy[i] + y;
  46.         if( grid[mx][my] == white && isOk(mx,my)  && isValid(i,pd) ) return false;
  47.     }
  48.     return true;
  49. }
  50.  
  51. void solve( int x, int y, int pd , int c ){ // was a fuck
  52.     if (grid[x][y] == goal ){
  53.         grid[x][y]=c;
  54.         flag = 1;
  55.         return;
  56.     }
  57.  
  58.     if (isNoMove(x,y,pd) ){
  59.         grid[x][y]=noway;
  60.         return;
  61.     }
  62.  
  63.     for ( int i = 0; i < 4; i++ ){
  64.         int mdx = dx[i] + x;
  65.         int mdy = dy[i] + y;
  66.         int fx = (dx[i] << 1) + x;
  67.         int fy = (dy[i] << 1) + y;
  68.  
  69.         if( isValid(i,pd) && isOk(fx,fy) && grid[mdx][mdy] == white && !flag){
  70.             solve( fx,fy, i, c+1 );
  71.             if (!flag)grid[x][y] = noway;
  72.             if(flag) grid[x][y] = c;
  73.         }
  74.     }
  75.            
  76. }
  77.  
  78.  
  79.  
  80. int main(){
  81.     #ifndef ONLINE_JUDGE
  82.         freopen("in.txt","rt",stdin);
  83.         freopen("out.txt","wt",stdout);
  84.     #endif
  85.  
  86.     int tc= 0;
  87.     while ( sf("%d %d %d %d %d %d", &l, &w, &sx, &sy, &gx, &gy) , l+w+sx+sy+gx+gy ){
  88.         for( int i=1; i<=l; i++ ){
  89.             for( int j=1; j<=w; j++ ){
  90.                 sf("%d",&a);
  91.                 if( a == 1 ) grid[(i << 1)][( j<<1 ) + 1] = block;
  92.                 else if( a == 2 ) grid[(i << 1)+1][( j<<1 )] = block;
  93.                 else if( a == 3 ) { grid[(i << 1)][( j<<1 ) + 1] = block; grid[(i << 1)+1][( j<<1 )] = block; }
  94.             }
  95.         }
  96.  
  97.         grid[sx<<1][sy<<1] = source; grid[gx<<1][gy<<1] = goal;
  98.         for( int i=1; i<=((w<<1)+1); i++ ) { grid[1][i] = block; grid[(l<<1)+1][i] = block; }
  99.         for( int i=1; i<=((l<<1)+1); i++ ) { grid[i][1] = block; grid[i][(w<<1)+1] = block; }
  100.  
  101.         int cur = 1,tx,ty;
  102.         sx = sx<<1;
  103.         sy = sy<<1;
  104.  
  105.         solve(sx,sy,-1,1);
  106.         printGrid();
  107.         printf("Maze %d\n\n", ++tc);
  108.         memset( ans, '\0', sizeof ans );
  109.         printGrid2();
  110.         puts("");
  111.         puts("");
  112.         clr();
  113.     }
  114.  
  115.     return 0;
  116. }
  117.  
  118. void clr(){
  119.     flag= false, c=0;
  120.     memset( grid, 0, sizeof grid );
  121.     memset( ans, '\0', sizeof ans );
  122. }
  123.  
  124. void printGrid(){
  125.     for( int i=1; i<= ( (l<<1)+1) ; i++ ){
  126.         for( int j=1; j<= ( w<<1)+1; j++ ){
  127.             printf("%2d ", grid[i][j] );
  128.         }
  129.         puts("");
  130.     }
  131. }
  132.  
  133. void printGrid2(){
  134.     for( int i=1; i<=(w<<2)+1 ; i++ ){
  135.         if( i%4 == 1 ) { ans[1][i] = '+'; ans[(l<<1)+1][i] = '+';}
  136.         else { ans[1][i] = '-';  ans[(l<<1)+1][i] = '-';}
  137.     }
  138.     for( int i=1; i<=(l<<1)+1; i+=2 ){
  139.         for(int j=1; j<=(w<<2)+1; j+=4){
  140.             ans[i][j] = '+';
  141.         }
  142.     }
  143.  
  144.     for( int i=1; i<=(l<<1)+1; i++ ){
  145.         if(i&1){
  146.             ans[i][1] = '+'; ans[i][(w<<2)+1] = '+';
  147.         }
  148.         else{
  149.              ans[i][1] = '|'; ans[i][(w<<2)+1] = '|';
  150.         }
  151.     }
  152.  
  153.  
  154.     for( int i=2; i<=(l<<1); i+=2 ){
  155.         for( int j=2; j<=(w<<2); j+=2 ){
  156.             int v = grid[i][j];
  157.             if( v == noway ){
  158.                 ans[i][j*2] = '?'; ans[i][(j*2)-1] = '?';
  159.                 ans[i][(j*2)-2] = '?';
  160.             }
  161.             else if( v > 0 )  {
  162.                 if( v <= 9 ){
  163.                     ans[i][j<<1] = v + '0';
  164.                     ans[i][(j<<1)-1] = ' ';
  165.                     ans[i][(j<<1)-1] = ' ';
  166.                 }
  167.                 else{
  168.                     if( v<=99 ){
  169.                         char d1 = v%10+'0'; char d2 = (v/10)+'0';
  170.                         ans[i][j<<1] = d1;
  171.                         ans[i][(j<<1)-1] = d2;
  172.                         ans[i][(j<<1)-1] = ' ';
  173.                     }
  174.                     else{
  175.                         ans[i][j<<1] = v%10+'0';
  176.                         ans[i][(j<<1)-1] = ((v/10)%10)+'0';
  177.                         ans[i][(j<<1)-1] = ((v/10)/10)+'0';
  178.                     }
  179.                 }
  180.             }
  181.             if(grid[i][j+1] == block ) ans[i][(j<<1)+1] = '|';
  182.                 if(grid[i+1][j] == block){
  183.                     ans[i+1][j*2] = '-'; ans[i+1][(j*2)-1] = '-';
  184.                     ans[i+1][(j*2)-2] = '-';
  185.             }
  186.         }
  187.     }
  188.  
  189.     for( int i=1; i<=(l<<1)+1; i++ ){
  190.         for( int j=1; j<=(w<<2)+1; j++ ){
  191.             if( (ans[i][j]>='0' && ans[i][j]<='9')|| ans[i][j] == '+' || ans[i][j] == '?' ||  ans[i][j] == '-' || ans[i][j] == '|' ){
  192.                 pf("%c",ans[i][j]);
  193.             }
  194.             else pf(" ");
  195.         }
  196.         puts("");
  197.     }
  198.  
  199. }
Add Comment
Please, Sign In to add comment