[大模拟]LuoGu P2033 Chessboard Dance

题目地址P2033 Chessboard Dance

题目描述
在棋盘上跳舞是件有意思的事情。现在给你一张国际象棋棋盘和棋盘上的一些子以及你的初始位置和方向。求按一定操作后,棋盘的状态。

操作有四种,描述如下:

move n n是非负整数,表示你按目前所在方向前进n步,如果即将走出棋盘,则停止。如果面前有棋子,则将其向前推一步。

turn left 向左转90度

turn right 向右转90度

turn back 向后转

输入输出格式
输入格式:
输入前8行,每行8个字符,给出棋盘状态。“.”表示该格为空,字母表示棋子,不同字母表示不同的棋子。你所在位置用“^”、“<”、“>”、“v”四个字母中一个表示,分别表示你的方向上、左、右、下。

接下来有若干行,每行一个操作。以“#”结束。操作数不超过1000个。

输出格式:
输出8行,每行8个字符,表示经过一系列操作后棋盘和你的状态。表示方法同输入。

输入输出样例

输入样例#1:

......bA
.....^..
........
........
........
........
........
........
move 2
turn right
move 1
#

输出样例#1:

......>b
........
........
........
........
........
........
........


大模拟..坑了5次 下了几次数据终于写完了(模拟就不写怎么写的辣 看得懂就好了)

扔代码

// #define fre yes

#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

const int maxn = 10;
char Map[maxn][maxn];

int flag = 0,sx,sy,tnt,tot;

template<typename T>inline void read(T&x)
{
    x = 0;char c;int lenp = 1;
    do { c = getchar();if(c == '-') lenp = -1; } while(!isdigit(c));
    do { x = x * 10 + c - '0';c = getchar(); } while(isdigit(c));
    x *= lenp;
}

void Magic()
{
    int poi = 1;
    int dx = 0,dy = 0;
    for (int i=0;i<8;i++)
    {
        for (int j=0;j<8;j++)
        {
            if(Map[i][j] == '^')
            {
                dx = i;
                dy = j;
                flag = 1;
                poi = 0;break;
            }
            if(Map[i][j] == '>')
            {
                dx = i;
                dy = j;
                flag = 2;
                poi = 0;break;
            }
            if(Map[i][j] == 'v')
            {
                dx = i;
                dy = j;
                flag = 3;
                poi = 0;break;
            }
            if(Map[i][j] == '<')
            {
                dx = i;
                dy = j;
                flag = 4;
                poi = 0;break;
            }
        } if(poi == 0) break;
    } sx = dx;sy = dy;
}

bool legal(int x,int y)
{
    if(x >= 0 && y >= 0 && x < 8 && y < 8) return true;
     return false;
}

void check(int x,int y)
{
    tnt = 0;char z,c;
    if(flag == 1)
    {
        while(x>=0)
        {
            x--;
            if(legal(x,y) && Map[x][y] == '.')
            {
                if(tnt == 0) Map[x][y] = Map[x+1][y];
                else Map[x][y] = z;
                break;
            }
            if(legal(x,y))
            {
                tnt++;
                c = Map[x][y];
                if(tnt == 1) Map[x][y] = Map[x+1][y];
                else { Map[x][y] = z; }
                z = c;
            } else break;
        }
    }
    if(flag == 2)
    {
        while(y<=7)
        {
            y++;
            if(legal(x,y) && Map[x][y] == '.')
            {
                if(tnt == 0) Map[x][y] = Map[x][y-1];
                else Map[x][y] = z;
                break;
            }
            if(legal(x,y))
            {
                tnt++;
                c = Map[x][y];
                if(tnt == 1) Map[x][y] = Map[x][y-1];
                else { Map[x][y] = z; }
                z = c;
            } else break;
        }
    }
    if(flag == 3)
    {
        while(x<=7)
        {
            x++;
            if(legal(x,y) && Map[x][y] == '.')
            {
                if(tnt == 0) Map[x][y] = Map[x-1][y];
                else Map[x][y] = z;
                break;
            }
            if(legal(x,y))
            {
                tnt++;
                c = Map[x][y];
                if(tnt == 1) Map[x][y] = Map[x-1][y];
                else { Map[x][y] = z; }
                z = c;
            } else break;
        }
    }
    if(flag == 4)
    {
        while(y>=0)
        {
            y--;
            if(legal(x,y) && Map[x][y] == '.')
            {
                if(tnt == 0) Map[x][y] = Map[x][y+1];
                else Map[x][y] = z;
                break;
            }
            if(legal(x,y))
            {
                tnt++;
                c = Map[x][y];
                if(tnt == 1) Map[x][y] = Map[x][y+1];
                else { Map[x][y] = z; }
                z = c;
            } else break;
        }
    }
}

void Move(int x,int y,int z)
{
    if(flag == 1)
    {
        while(z--)
        {
            x--;
            if(legal(x,y))
            {
                if(Map[x][y] != '.') { check(x,y);Map[x][y] = '^';Map[x+1][y] = '.'; }
                else Map[x][y] = '^',Map[x+1][y] = '.';
            } else { x = 0;break; }
        }
    } 
    if(flag == 2)
    {
        while(z--)
        {
            y++;
            if(legal(x,y))
            {
                if(Map[x][y] != '.') { check(x,y);Map[x][y] = '>';Map[x][y-1] = '.'; }
                else Map[x][y] = '>',Map[x][y-1] = '.';
            } else { y = 7;break; }
        }
    }
    if(flag == 3)
    {
        while(z--)
        {
            x++;
            if(legal(x,y))
            {
                if(Map[x][y] != '.') { check(x,y);Map[x][y] = 'v';Map[x-1][y] = '.'; }
                else Map[x][y] = 'v',Map[x-1][y] = '.';
            } else { x = 7;break; }
        }
    }
    if(flag == 4)
    {
        while(z--)
        {
            y--;
            if(legal(x,y))
            {
                if(Map[x][y] != '.') { check(x,y);Map[x][y] = '<';Map[x][y+1] = '.'; }
                else Map[x][y] = '<',Map[x][y+1] = '.';
            } else { y = 0;break; }
        }
    } sx = x;sy = y;
}

void change(int x,int y)
{
    if(x == 1 && y == 1) flag = 4;
    else if(x == 1 && y == 2) flag = 2;
    else if(x == 1 && y == 3) flag = 3;
    else if(x == 2 && y == 1) flag = 1;
    else if(x == 2 && y == 2) flag = 3;
    else if(x == 2 && y == 3) flag = 4;
    else if(x == 3 && y == 1) flag = 2;
    else if(x == 3 && y == 2) flag = 4;
    else if(x == 3 && y == 3) flag = 1;
    else if(x == 4 && y == 1) flag = 3;
    else if(x == 4 && y == 2) flag = 1;
    else if(x == 4 && y == 3) flag = 2;
}

int main()
{
#ifdef fre
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
#endif

    for (int i=0;i<8;i++) scanf("%s",Map[i]);
    Magic();
    while(1)
    {
        string c;
        cin >> c;
        if(c == "#") break;
        else if(c == "move")
        {
            int x;
            read(x);
            if(x == 0) continue;
            Move(sx,sy,x);
        }
        else if(c == "turn")
        {
            string r;
            cin >> r;
            string a="left",b="right",c="back";
            if(r == a) change(flag,1); 
            else if(r == b) change(flag,2);
            else if(r == c) change(flag,3);
            if(flag == 1) Map[sx][sy] = '^';
            if(flag == 2) Map[sx][sy] = '>';
            if(flag == 3) Map[sx][sy] = 'v';
            if(flag == 4) Map[sx][sy] = '<';
        }
    }

    for (int i=0;i<8;i++)
    {
        for (int j=0;j<8;j++)
        {
            printf("%c",Map[i][j]);
        } puts("");
    } return 0;
}

猜你喜欢

转载自www.cnblogs.com/Steinway/p/9232556.html