标签:void 字母 描述 direct 直接 har ace 国际 输出
在棋盘上跳舞是件有意思的事情。现在给你一张国际象棋棋盘和棋盘上的一些子以及你的初始位置和方向。求按一定操作后,棋盘的状态。
操作有四种,描述如下:
move n n是非负整数,表示你按目前所在方向前进n步,如果即将走出棋盘,则停止。如果面前有棋子,则将其向前推一步。
turn left 向左转90度
turn right 向右转90度
turn back 向后转
输入前8行,每行8个字符,给出棋盘状态。“.”表示该格为空,字母表示棋子,不同字母表示不同的棋子。你所在位置用“^”、“<”、“>”、“v”四个字母中一个表示,分别表示你的方向上、左、右、下。
接下来有若干行,每行一个操作。以“#”结束。操作数不超过1000个。
输出8行,每行8个字符,表示经过一系列操作后棋盘和你的状态。表示方法同输入。
输入
......bA .....^.. ........ ........ ........ ........ ........ ........ move 2 turn right move 1 #
输出
......>b
........
........
........
........
........
........
........
如果前面是空地,直接向前走。
如果前面是字符,先遍历字符前面的点,如果遍历到一个空地再推
如果当前点到达了边界则break。
真就直接暴力模拟
多个棋子可以一起推
#include <bits/stdc++.h> using namespace std; char s[10001][10001]; char situtation[4] = {‘^‘,‘v‘,‘<‘,‘>‘}; int direction = 0 , x , y; int direction_back[5] = {0 , 2 , 1 , 4 , 3}; int direction_right[5] = {0 , 4 , 3 , 1 , 2}; int direction_left[5] = {0 , 3 , 4 , 2 , 1}; void Go_Up(int k) { int x_next = x; int y_next = y; for(int i = x - 1; i >= 1; i--) { if(x_next == 1) break; if(!k) break; if(s[i][y] == ‘.‘) { x_next--; k--; continue; } if(s[i][y] != ‘.‘) { int flag = i; for(int j = i; j >= 1; j--) if(s[j][y] == ‘.‘ || j == 1) { flag = j; break; } for(int j = flag; j <= i; j++) s[j][y] =s [j + 1][y]; x_next--; k--; } } x = x_next; } void Go_Down(int k) { int x_next = x; int y_next = y; for(int i = x + 1; i <= 8; i++) { if(x_next == 8) break; if(!k) break; if(s[i][y] == ‘.‘) { x_next++; k--; continue; } if(s[i][y] != ‘.‘) { int flag = i; for(int j = i; j <= 8; j++) if(s[j][y] == ‘.‘ || j == 8) { flag = j; break; } for(int j = flag; j >= i; j--) s[j][y] = s[j - 1][y]; x_next++; k--; } } x = x_next; } void Go_Left(int k) { int y_next = y; for(int i = y - 1; i >= 1; i--) { if(y_next == 1) break; if(k == 0) break; if(s[x][i] == ‘.‘) { y_next--; k--; continue; } if(s[x][i] != ‘.‘) { int flag = i; for(int j = i; j >= 1; j--) { if(s[x][j] == ‘.‘||j == 1) { flag = j; break; } } for(int j = flag; j <= i; j++) s[x][j] = s[x][j + 1]; y_next--; k--; } } y = y_next; } void Go_Right(int k) { int y_next = y; for(int i = y + 1; i <= 8; i++) { if(y_next == 8) break; if(!k) break; if(s[x][i] == ‘.‘) { y_next++; k--; continue; } if(s[x][i] != ‘.‘) { int flag = i; for(int j = i; j <= 8; j++) { if(s[x][j] == ‘.‘ || j == 8) { flag = j; break; } } for(int j = flag; j >= i; j--) s[x][j] = s[x][j - 1]; y_next++; k--; } } y = y_next; } int main() { ios::sync_with_stdio(false); for(int i = 1; i <= 8; i++) for(int j = 1; j <= 8; j++) { cin >> s[i][j]; if(s[i][j] == ‘^‘) { direction=1; s[i][j] = ‘.‘; x = i; y = j; } if(s[i][j] == ‘v‘) { direction = 2; x = i; y = j; s[i][j] = ‘.‘; } if(s[i][j] == ‘<‘) { x = i; y = j; s[i][j] = ‘.‘; direction = 3; } if(s[i][j] == ‘>‘) { x = i; y = j; s[i][j] = ‘.‘; direction = 4; } } string a,b; int c; int t = 0; while(1) { cin >> a; if(a == "#") break; else if(a == "turn") { cin >> b; if(b == "right") direction = direction_right[direction]; else if(b == "left") direction = direction_left[direction]; else if(b == "back") direction = direction_back[direction]; } else if(a == "move") { cin >> c; if(direction == 1) Go_Up(c); else if(direction == 2) Go_Down(c); else if(direction == 3) Go_Left(c); else if(direction == 4) Go_Right(c); } } for(int i = 1; i <= 8; i++) { for(int j = 1; j <= 8; j++) { if(x == i && y == j) cout << situtation[direction - 1]; else cout << s[i][j]; } cout << endl; } return 0; }
标签:void 字母 描述 direct 直接 har ace 国际 输出
原文地址:https://www.cnblogs.com/Tenderfoot/p/13894443.html