VasilM

black holes and mirrors ( 24.2.2013 )

Feb 24th, 2013
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.34 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdlib>
  4. #include <map>
  5. #include <set>
  6. #include <queue>
  7. #include <cstdio>
  8. #include <algorithm>
  9. #include <cstring>
  10. #include <cmath>
  11. #include <ctime>
  12. #define f(i,beg,end) for(int i=beg; i<end; i++)
  13. using namespace std;
  14. typedef unsigned long long ull;
  15. typedef vector < int > vi;
  16. typedef vector < vi > vii;
  17.  
  18. unsigned Lab[501][501], n, m, x, y;
  19. int br, maxBr = 0;
  20. bool newline = false;
  21.  
  22. int main()
  23. {
  24.     while( cin >> n >> m ){
  25.  
  26.         if( newline ) cout << endl;
  27.         newline = true;
  28.  
  29.         for( unsigned i=1; i<=n; i++){
  30.             for( unsigned j=1; j<=m; j++){
  31.                 char z;
  32.                 cin >> z;
  33.                 if( z =='.') Lab[i][j] = 1;
  34.                 if( z =='/') Lab[i][j] = 2;
  35.                 if( z =='\\'){ Lab[i][j] = 3;}
  36.                 if( z =='C') Lab[i][j] = 0;
  37.             }
  38.         }
  39.  
  40.         cin >> x >> y;
  41.         int startX, startY;
  42.         startX = x;
  43.         startY = y;
  44.         maxBr = 0;
  45.         bool frv = true;
  46.  
  47.         unsigned dirrection=0, startDirrection=0;
  48.         for( unsigned d=1; d<=4 && frv; d++){
  49.            
  50.             dirrection = d;            
  51.             x = startX;
  52.             y = startY;
  53.  
  54.             while( Lab[x][y] != 0 && x<=n && x> 0 && y<=m && y>0){
  55.  
  56.                 if( Lab[x][y] == 2 ){
  57.                     if( dirrection == 1 ) dirrection = 2;
  58.                     else if( dirrection == 2 ) dirrection = 1;
  59.                     else if( dirrection == 3 ) dirrection = 4;
  60.                     else if( dirrection == 4 ) dirrection = 3;
  61.                 }
  62.                
  63.                 if( Lab[x][y] == 3 ){
  64.                     if( dirrection == 1 ) dirrection = 4;
  65.                     else if( dirrection == 2 ) dirrection = 3;
  66.                     else if( dirrection == 3 ) dirrection = 2;
  67.                     else if( dirrection == 4 ) dirrection = 1;
  68.                 }
  69.                
  70.                 switch( dirrection ){
  71.                     case 1: x--;
  72.                     break;
  73.                     case 2: y++;
  74.                     break;
  75.                     case 3: x++;
  76.                     break;
  77.                     case 4: y--;
  78.                     break;
  79.                 }
  80.                                
  81.                 if( x == startX && y == startY && dirrection == d){
  82.                     frv = false;
  83.                     startDirrection = d;
  84.                     break;
  85.                 }
  86.                
  87.                 br++;
  88.             }
  89.             if( br > maxBr ) {
  90.                 maxBr = br;
  91.                 startDirrection = d;
  92.             }
  93.             br = 0;
  94.         }
  95.                
  96.         switch( startDirrection ){
  97.             case 1: cout << "U" << endl;
  98.             break;
  99.             case 2: cout << "R" << endl;
  100.             break;
  101.             case 3: cout << "D" << endl;
  102.             break;
  103.             case 4: cout << "L" << endl;
  104.             break;
  105.             default: cout << "U" << endl; break;
  106.         }
  107.         if(!frv){
  108.             cout << "Forever" << endl;
  109.         }else cout << maxBr << endl;
  110.     }
  111.  
  112.      string ifEnd;
  113.      cin >> ifEnd;      
  114.     return 0;  
  115. }
  116. /*
  117. A. Лабиринт
  118. Провеждаме експеримент, пускайки светлинен лъч в лабиринт (за простота представен чрез матрица N х М (1 ≤ N, M ≤ 500)). Всяка клетка може да бъде празна (“.”), черна дупка (“C”) или огледало, означено с един от символите “/” или “\”, в зависимост от това накъде е наклонено. Когато светлината попада върху огледало се отклонява по един от следните начини:
  119.  
  120. Светлината може да се разпространява по редове и колони, като когато достигне до огледало, променя посоката си на 90 градуса, спазвайки горепоказаните правила. Преминаването през една клетка до нейна съседна става за 1 секунда. Ако светлината достигне до черна дупка, бива погълната. Светлината „напуска лабиринта“, ако достигне до някоя гранична клетка.
  121. Вашата задача е по зададена стартова позиция, от която пускаме светлината, да определите максималния период от време (в секунди), през който светлината ще се движи в лабиринта, преди да го напусне или да бъде погълната от черна дупка.
  122. На първия ред на всеки тест са зададени N и M. Следват N реда с по М символа, описващи лабиринта. Последният ред от примера съдържа стартовата позиция (ред, колона). Индексирането започва от 1. Краят на входа е маркиран с “END”.
  123. За всеки тест на първия ред извеждайте избраната начална посока - “U” за нагоре, “R” за надясно, “D” за надолу и “L” за наляво, в която трябва да насочим лъча. Втория ред трябва да съдържа търсеното време или „Forever“ ако движението на светлината може да продължи безкрайно дълго време. Ако съществуват повече от едно възможни най-добри времена и различни посоки, то избирайте посоката, базирайки се на следния приоритет: “U”, “R”, “D”, “L”. Извеждайте по един празен ред между резултатите от всеки два тестови примера.  
  124. Вход
  125. 5 5
  126. ../.\
  127. .....
  128. .C...
  129. ...C.
  130. \.../
  131. 3 3 5 7
  132. /.....\
  133. ../..\.
  134. \...../
  135. /.....\
  136. \.\.../
  137. 3 3
  138. END
  139.  
  140. Изход
  141. U
  142. 17
  143.  
  144. R
  145. Forever
  146. */
Advertisement
Add Comment
Please, Sign In to add comment