• [大模拟]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;
    }
    
  • 相关阅读:
    C/C++程序员必备的15个编辑器和集成开发环境
    天猫浏览型应用的CDN静态化架构演变
    实用技巧:如何用 CSS 做到完全垂直居中
    JavaScript 字符串操作:substring, substr, slice
    Hybrid App 开发初探:使用 WebView 装载页面
    引领潮流!最顶尖的24个获奖网页作品
    HTML5编程之旅系列一:HTML5 Geolocation 初探
    JavaScript 秘密花园——对象的使用和属性操作
    提高效率!15款最好的 Bug 跟踪应用程序
    最常用的8款 PHP 调试工具,你用过吗?
  • 原文地址:https://www.cnblogs.com/Steinway/p/9232556.html
Copyright © 2020-2023  润新知