1 条题解
-
0
自动搬运
来自洛谷,原作者为

冰糖鸽子
还不是能说晚安的时候哦。搬运于
2025-08-24 21:33:10,当前版本为作者最后更新于2020-06-21 13:13:37,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
蒟蒻第二道蓝题,居然一次过的qwq
题意:
-
有一个 矩阵,有些地方有物品,有一个地方是你
-
你所在位置用
^、<、>、v四个字母中一个表示,你最开始面向的方向就是箭头的朝向 -
有许多条命令,整个输入一一行一个
#结束 -
命令1:
move n,表示你要往前(你面向的方向)走 步,如果走到矩阵边缘就不走了 -
命令2:
turn XX其中 XX 可能是right,left,back,分别表示向右,向左,向后转 -
重点:你向前走时,如果你前面有物品,则你要推着物品一起走,如果物品前面还有物品,则要一起往前推
思路:
-
首先,输入时确定好你的方向和位置
-
输入命令时先输入第一个词,然后判断是往前走还是转弯
-
往前走的话就执行 次往前走一步
-
转弯的话就把方向
可能你不太懂,那就看代码吧,都在注释里了:
#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;//结束 } -
- 1
信息
- ID
- 998
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 4
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者