zoukankan      html  css  js  c++  java
  • [大模拟]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;
    }
    
  • 相关阅读:
    CSS页面渲染优化属性will-change
    前端自动化构建工具-yoman浅谈
    【积累】如何优雅关闭SpringBoot Web服务进程
    SpringCloud Eureka Client和Server侧配置及Eureka高可用配置
    SpringBoot返回html页面
    MySQL8主从配置
    使用Arrays.asList抛出java.lang.UnsupportedOperationException
    SpringMVC+Mybatis+MySQL8遇到的问题
    MySQL5.6启用sha256_password插件
    Base64简单原理
  • 原文地址:https://www.cnblogs.com/Steinway/p/9232556.html
Copyright © 2011-2022 走看看