IoIiderp

hacker.org/coil solver 3

Jun 14th, 2017
308
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.92 KB | None | 0 0
  1. // Look for FlashVars in Element Inspect in hacker.org/coil
  2.  
  3. #include <iostream>
  4. #include <vector>
  5.  
  6. const int sizeX = 16;
  7. const int sizeY = 16;
  8. int gameMap[sizeY][sizeX];
  9.  
  10.  
  11. std::string Board = "..........X.........X.....X..XX.X.....XX..XX....X....X....XXXX.........XX........X..X........XX..XXX..X...........XX........X...X......XXX....X....XXXXXXX.X.....X..XXXX............X.....X.XXXX..XXX...X.X..X....XXXX..X....X..........X...............X.......";
  12. void MakeMap() {
  13.     for(int y=0; y<sizeY; y++) {
  14.         for(int x=0; x<sizeX; x++) {
  15.             gameMap[y][x] = ((Board[sizeX*y + x])=='.'?0:1);
  16.         }
  17.     }
  18. }
  19.  
  20.  
  21.  
  22. std::vector<char>* history = new std::vector<char>;
  23. int currentMove = 2;
  24.  
  25.  
  26.  
  27. class PlayerObj {
  28. public:
  29.     int x=0;
  30.     int y=0;
  31.  
  32.     bool MoveLeft() {
  33.         bool CouldMove = false;
  34.         while((x>0) && (!gameMap[y][x-1])) {
  35.             CouldMove = true;
  36.             gameMap[y][x] = currentMove;
  37.             x--;
  38.         }
  39.         if(CouldMove) currentMove++;
  40.         return CouldMove;
  41.     }
  42.  
  43.     bool MoveRight() {
  44.         bool CouldMove = false;
  45.         while((x<sizeX-1) && (!gameMap[y][x+1])) {
  46.             CouldMove = true;
  47.             gameMap[y][x] = currentMove;
  48.             x++;
  49.         }
  50.         if(CouldMove) currentMove++;
  51.         return CouldMove;
  52.     }
  53.  
  54.     bool MoveUp() {
  55.         bool CouldMove = false;
  56.         while((y>0) && (!gameMap[y-1][x])) {
  57.             CouldMove = true;
  58.             gameMap[y][x] = currentMove;
  59.             y--;
  60.         }
  61.         if(CouldMove) currentMove++;
  62.         return CouldMove;
  63.     }
  64.  
  65.     bool MoveDown() {
  66.         bool CouldMove = false;
  67.         while((y<sizeY-1) && (!gameMap[y+1][x])) {
  68.             CouldMove = true;
  69.             gameMap[y][x] = currentMove;
  70.             y++;
  71.         }
  72.         if(CouldMove) currentMove++;
  73.         return CouldMove;
  74.     }
  75.  
  76.     bool EraseLeft() {
  77.         bool CouldMove = false;
  78.         while((x>0) && (gameMap[y][x-1]==currentMove-1)) {
  79.             CouldMove = true;
  80.             gameMap[y][x] = 0;
  81.             x--;
  82.         }
  83.         if(CouldMove) currentMove--;
  84.         return CouldMove;
  85.     }
  86.  
  87.     bool EraseRight() {
  88.         bool CouldMove = false;
  89.         while((x<sizeX-1) && (gameMap[y][x+1]==currentMove-1)) {
  90.             CouldMove = true;
  91.             gameMap[y][x] = 0;
  92.             x++;
  93.         }
  94.         if(CouldMove) currentMove--;
  95.         return CouldMove;
  96.     }
  97.  
  98.     bool EraseUp() {
  99.         bool CouldMove = false;
  100.         while((y>0) && (gameMap[y-1][x]==currentMove-1)) {
  101.             CouldMove = true;
  102.             gameMap[y][x] = 0;
  103.             y--;
  104.         }
  105.         if(CouldMove) currentMove--;
  106.         return CouldMove;
  107.     }
  108.  
  109.     bool EraseDown() {
  110.         bool CouldMove = false;
  111.         while((y<sizeY-1) && (gameMap[y+1][x]==currentMove-1)) {
  112.             CouldMove = true;
  113.             gameMap[y][x] = 0;
  114.             y++;
  115.         }
  116.         if(CouldMove) currentMove--;
  117.         return CouldMove;
  118.     }
  119.  
  120.     bool Undo() {
  121.  
  122.     }
  123. };
  124.  
  125. PlayerObj* player = new PlayerObj;
  126.  
  127.  
  128.  
  129. void PrintMap() {
  130.     for(int y=0; y<sizeY; y++) {
  131.         for(int x=0; x<sizeX; x++) {
  132.             if((player->x == x) && (player->y == y)) {
  133.                 std::cout << 'x';
  134.             } else {
  135.                 std::cout << (gameMap[y][x]?'#':'.');
  136.             }
  137.         }
  138.         std::cout << std::endl;
  139.     }
  140.     std::cout << std::endl;
  141. }
  142.  
  143. bool IsMapComplete() {
  144.     bool result = true;
  145.     for(int y=0; y<sizeY; y++) {
  146.         for(int x=0; x<sizeX; x++) {
  147.             if(!(gameMap[y][x])) {
  148.                 if(!(player->x==x && player->y==y)) {
  149.                     result = false;
  150.                     break;
  151.                 }
  152.             }
  153.         }
  154.         if(!result) break;
  155.     }
  156.     return result;
  157. }
  158.  
  159.  
  160. void Undo() {
  161.     switch(history->back()) {
  162.     case 'L':
  163.         player->EraseRight();
  164.         history->pop_back();
  165.         break;
  166.     case 'R':
  167.         player->EraseLeft();
  168.         history->pop_back();
  169.         break;
  170.     case 'U':
  171.         player->EraseDown();
  172.         history->pop_back();
  173.         break;
  174.     case 'D':
  175.         player->EraseUp();
  176.         history->pop_back();
  177.         break;
  178.     }
  179. }
  180.  
  181.  
  182. char FirstMove = ' ';
  183. bool CanContinue = true;
  184. bool MovePlayer(char skip) {
  185.     if((!((skip=='L') || (skip=='R') || (skip=='U') || (skip=='D'))) && player->MoveLeft()){
  186.         history->push_back('L');
  187.         if(FirstMove=='L' && history->size()==1) CanContinue = false;
  188.         if(FirstMove==' ')FirstMove='L';
  189.     } else if((!((skip=='R') || (skip=='U') || (skip=='D'))) && player->MoveRight()) {
  190.         history->push_back('R');
  191.         if(FirstMove=='R' && history->size()==1) CanContinue =  false;
  192.         if(FirstMove==' ')FirstMove='R';
  193.     } else if ((!((skip=='U') || (skip=='D'))) && player->MoveUp()) {
  194.         history->push_back('U');
  195.         if(FirstMove=='U' && history->size()==1) CanContinue =  false;
  196.         if(FirstMove==' ')FirstMove='U';
  197.     } else if ((!(skip=='D')) && player->MoveDown()) {
  198.         history->push_back('D');
  199.         if(FirstMove=='D' && history->size()==1) CanContinue =  false;
  200.         if(FirstMove==' ')FirstMove='D';
  201.     } else {
  202.         return false;
  203.     }
  204.  
  205.  
  206.  
  207.     return true;
  208. }
  209.  
  210.  
  211. bool TryPosition(int posX, int posY) {
  212.     player->x = posX;
  213.     player->y = posY;
  214.  
  215.     char skip = ' ';
  216.     while(CanContinue) {
  217.         if(!MovePlayer(skip)){
  218.             if(!IsMapComplete()) {
  219.                 skip = history->back();
  220.                 Undo();
  221.             } else {
  222.                 return true;
  223.             }
  224.         } else {
  225.             skip = ' ';
  226.         }
  227.     }
  228.     return false;
  229. }
  230.  
  231.  
  232. int gameMapCopy[sizeY][sizeX];
  233. void Reset() {
  234.     for(int y=0; y<sizeY; y++) {
  235.         for(int x=0; x<sizeX; x++) {
  236.             gameMap[y][x] = gameMapCopy[y][x];
  237.         }
  238.     }
  239.     FirstMove = ' ';
  240.     CanContinue = true;
  241.     history->clear();
  242. }
  243.  
  244. int main()
  245. {
  246.     MakeMap();
  247.     PrintMap();
  248.  
  249.  
  250.     for(int y=0; y<sizeY; y++) {
  251.         for(int x=0; x<sizeX; x++) {
  252.             gameMapCopy[y][x] = gameMap[y][x];
  253.         }
  254.     }
  255.  
  256.     bool FoundResult = false;
  257.     int FoundX, FoundY;
  258.     for(int y=0; y<sizeY; y++) {
  259.         for(int x=0; x<sizeX; x++) {
  260.             Reset();
  261.             if(!(gameMap[y][x])) {
  262.                 if(TryPosition(x,y)) {
  263.                     FoundResult = true;
  264.                     FoundX = x;
  265.                     FoundY = y;
  266.                     break;
  267.                 }
  268.             }
  269.         }
  270.         if(FoundResult) break;
  271.     }
  272.  
  273.     std::cout << "x:" << FoundX << " | y:" << FoundY << std::endl;
  274.     for(int i=0; i<history->size(); i++) {
  275.         std::cout << (*history)[i];
  276.     }
  277.     std::cout << std::endl << std::endl;
  278.     std::cout << "http://www.hacker.org/coil/index.php?x=" << FoundX << "&y=" << FoundY << "&path=";
  279.     for(int i=0; i<history->size(); i++) {
  280.         std::cout << (*history)[i];
  281.     }
  282.     std::cout << std::endl;
  283. }
Add Comment
Please, Sign In to add comment