题解 P2033 【Chessboard Dance】

· · 题解

原题传送门

蒟蒻第二道蓝题,居然一次过的qwq

题意:

思路:

可能你不太懂,那就看代码吧,都在注释里了:

#include <bits/stdc++.h>//懒人神器
using namespace std;
char q[8][8],vs[4] = {'<','^','>','v'};//q是棋盘,vs是最后输出时纠正方向用的
int fx[4] = {0,-1,0,1},fy[4] = {-1,0,1,0};//炒鸡好用的移动数组
int qx,qy,f;//qx和qy是你的位置,f是方向
string pd;
void d(int x,int y)
{
    int lx = x + fx[f];//预览x
    int ly = y + fy[f];//预览y
    if(lx < 0 || lx > 7 || ly < 0 || ly > 7)//如果越界了
    {
        return;//结束,返回到上一层
    }
    if(q[lx][ly] != '.')//如果当前方向前面有棋子
    {
        d(lx,ly);//以那个棋子递归
    }
    q[lx][ly] = q[x][y];//将棋子往前移动一格
    q[x][y] = '.';//自己走了之后就变为空
    qx = lx;//这里注意,因为只要运行到了这里那最后lx和ly就是你往前走后的位置
    qy = ly;//所以将你的位置设置成lx和ly
}
int main()
{
    for(int i = 0;i < 8;i++)//直接输入
    {
        for(int j = 0;j < 8;j++)//输入
        {
            cin >> q[i][j];
            if(q[i][j] == '<')//方向为左
            {
                f = 0;//设置方向
                qx = i;//设置位置
                qy = j;//设置位置
            }
            if(q[i][j] == '^')//同上
            {
                f = 1;
                qx = i;
                qy = j;
            }
            if(q[i][j] == '>')//同上
            {
                f = 2;
                qx = i;
                qy = j;
            }
            if(q[i][j] == 'v')//同上
            {
                f = 3;
                qx = i;
                qy = j;
            }
        }
    }
    cin >> pd;//先输入
    int a;//move命令所用的
    while(pd != "#")//结束之前
    {
        if(pd == "move")//往前走的命令
        {
            cin >> a;//走多少步
            for(int i = 0;i < a;i++)//简化过程
            {
                d(qx,qy);//参考第7行d函数
            }
        }
        if(pd == "turn")//转向命令
        {
            cin >> pd;
            if(pd == "left")
            {
                f--;//往左
            }
            if(pd == "right")
            {
                f++;//往右
            }
            if(pd == "back")
            {
                f += 2;//往后
            }
            if(f >= 4)//超出了
            {
                f -= 4;//转回去
            }
            if(f < 0)//成了负数
            {
                f += 4;//转回去
            }
        }
        cin >> pd;//再次输入命令
    }
    q[qx][qy] = vs[f];//将你设成当前方向的状态
    for(int i = 0;i < 8;i++)//输出
    {
        for(int j = 0;j < 8;j++)//输出
        {
            cout << q[i][j];//输出,不加空格
        }
        cout << endl;//记得换行
    }
    return 0;//结束
}