LoginSignup
0
0

More than 5 years have passed since last update.

Rails on Tiles

Posted at
Source.cpp
#include "Header.h"

RailsOnTiles::RailsOnTiles()
{
    m_direction = NORTH;
    m_tile = B;
}

void RailsOnTiles::placeInfoChange(TILENUMBER outside1, TILENUMBER outside2, TILENUMBER outside3, DIRECTIONS direction, TILEMOVE tilemove)
{
    if(m_tile == outside1 || m_tile == outside2 || m_tile == outside3){
        m_direction = OutSide;
        return;
    }
    m_direction = direction;
    m_tile = (TILENUMBER)((int)m_tile + tilemove);
}

void RailsOnTiles::moveUpper()
{
    placeInfoChange(A, B, C, SOUTH, UPPER);
}

void RailsOnTiles::moveLeft()
{
    placeInfoChange(A, D, G, EAST, LEFT);
}

void RailsOnTiles::moveRight()
{
    placeInfoChange(C, F, I, WEST, RIGHT);
}

void RailsOnTiles::moveUnder()
{
    placeInfoChange(G, H, I, NORTH, UNDER);
}

void RailsOnTiles::tile0Course()
{
    switch(m_direction){
        case EAST   :   moveLeft(); break;
        case SOUTH  :   moveUpper();break;
        case WEST   :   moveRight();break;
        case NORTH  :   moveUnder();
    }
}

void RailsOnTiles::tile1Course()
{
    switch(m_direction){
        case EAST   :   moveUpper();break;
        case SOUTH  :   moveLeft(); break;
        case WEST   :   moveUnder();break;
        case NORTH  :   moveRight();
    }
}

void RailsOnTiles::tile2Course()
{   
    switch(m_direction){
        case EAST   :   moveUnder();break;
        case SOUTH  :   moveRight();break;
        case WEST   :   moveUpper();break;
        case NORTH  :   moveLeft();
    }
}

const char RailsOnTiles::moveTile(int& tileType)
{
    switch(tileType){
        case 0  :   tile0Course(); break;
        case 1  :   tile1Course(); break;
        case 2  :   tile2Course();
    }
    return m_tile + 'A';
}

const std::string RailsOnTiles::solve(const std::string& input)
{
    std::string result = "B";
    while(m_direction != OutSide){
        int tileType = input.at(m_tile) - '0';
        result += moveTile(tileType);
    }
    result.erase(--result.end());
    return result;
}


void test(const std::string& input, const std::string& output)
{
    static int testNumber = 1;
    RailsOnTiles ROT;
    std::string result = ROT.solve(input);
    std::cout << testNumber << ":" << result << " 正解は " << output << std::endl;
    if(result != output){
        std::cout << "test is NG!" << std::endl;
    }
    testNumber++;
}

int main()
{
    test("101221102","BEDGHIFEH");
    return 0;
}
Header.h
#ifndef _HEADER_H
#define _HEADER_H

#include<iostream>
#include<string>

class RailsOnTiles
{
public:
    RailsOnTiles();
    const std::string solve(const std::string& input);

private:
    enum DIRECTIONS{ EAST, SOUTH, WEST, NORTH ,OutSide};
    enum TILEMOVE{UPPER = -3, LEFT = -1, RIGHT = 1, UNDER = 3};
    enum TILENUMBER{A, B, C, D, E, F, G, H, I};
    DIRECTIONS m_direction;
    TILENUMBER m_tile;

    const char moveTile(int& tileType);
    void moveUpper();
    void moveLeft();
    void moveRight();
    void moveUnder();
    void tile0Course();
    void tile1Course();
    void tile2Course();
    void placeInfoChange(TILENUMBER outside1, TILENUMBER outside2, TILENUMBER outside3, DIRECTIONS direction, TILEMOVE tilemove);
};

#endif

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0