• [大模拟]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;
    }
    
  • 相关阅读:
    jmeter(六)元件的作用域与执行顺序
    通过数据自动生成流程图(前端方向) dagred3
    jmeter(二)录制脚本
    最准的中文文本相似度计算工具
    BERT文本相似度实战
    Jmeter 字符串拼接参数
    常见数据库字段类型与java.sql.Types的对应
    jmeter(二十七)分布式压测注意事项
    词法分析利用Jieba实现高频词提取(Python)
    jmeter(二十一)jmeter常用插件介绍
  • 原文地址:https://www.cnblogs.com/Steinway/p/9232556.html
Copyright © 2020-2023  润新知